从PHP 7.4升级到PHP 8.2是惊人的变化

一直工作在PHP7的版本下,最近把环境都挪到了PHP8下面,具体用的是最新的8.2.3版本。不得不说,这个变化是天翻地覆的,有很多专门的文章写了PHP8的特点,我也稍微记录下自己角度的观察。

  • 支持更多强类型,这个在php7里其实也可以有,叫做标量,打开严格模式即可,但问题是提供的类型不多。PHP8就基本支持了完整的类型,包括方法的返回值,这样的写法对内存的使用处置肯定有极大好处的。
  public function weibo(WeiboService $weiboService):Response
  • 支持使用问号?的null的返回,虽然php是脚本语言,但这个东东其实在现在语言里很有用,可见未来会有更完整的nullable支持,但历史代码库肯定要做大规模升级,同时也需要java里optional类的支持。
public function share(string $text, string $ip, ?string $pic = null): void
  • 有了枚举,让代码阅读起来更清晰更清晰,同时作为形参可以限制范围,而不是要判断int取值的范围。
enum PlatformConfig: int
{
    case TENCENT = 1;
    case BAIDU = 2;
    case ALIPAY = 3;
    case APP_ANDROID = 4;
    case APP_IOS = 5;
}
  • readonly关键字,提升代码效率,8.2支持class级别的readonly。也就是说在写构造函数的时候,可以用readonly确认类对象的只读属性,用private来控制访问级别,简化类对象的初始化,唯一有个小缺点,既然都干净了,为什么不把body的{}花括号一起省略掉呢,代码可以更美观。
readonly class LoginSubscriber implements EventSubscriberInterface
{
    public function __construct(private TokenStorageInterface $storage, private JWTService $manager, private LoginRepository $loginRepository)
    {
    }
}
  • readonly进阶带来一个特性,简单来说就是immutable风格对象,例如在跨平台前段Flutter框架里,所有的对象都是不可变的。这种风格的写法带来一个好处就是可以方便计算对象是否变化,但如果要改变某个属性,要做的是为类提供一个类似copyWith的方法,改变内部值并且返回一个新的对象,新对象肯定有有新的hashcode。Flutter因为是基于Dart的,Dart没有反射,但PHP又反射,所以可以用第三方的包来实现这种设计风格。
class Post
{
    use Cloneable;
    public readonly string $title;
    public readonly string $author;
    public function __construct(string $title, string $author)
    {
        $this->title = $title;
        $this->author = $author;
    }
}

总结就是,PHP8是划时代的,更具有方向性的,我们可以知道PHP团队走在一条正确的道路上。:D


已发布

分类

作者:

标签