令人期待的PHP 8预计在2020年11月就要发布了, 这是一个全新的里程碑式的新版本, 将有一些全新的变化, 包括新的特性与显著的性能提升. 当然, 现在PHP 8还在持续的开发过程中, 但是第一个Alpha测试版本将在2020年6月18号发布公测.
因为PHP 8中这些全新的变化, 恐怕你需要对现有项目的部分代码做出调整,才能让它们在PHP 8的环境下运行起来. 当然,如果你一直持续的更新你项目所依赖的PHP的版本, 那么升级工作肯定要容易一些, 毕竟相对于PHP 7.X版本来讲, 要做出的调整比 PHP 5.x 要少多了。当然,不用担心,我会把最重要的变化列出来供你参考.
这些重要的变化,包括 JIT编译器, 联合类型数据Union Types,属性Attributes等.
PHP 8新特性1: 联合数据类型
请参照针对Union Types 2.0的官方最新定义, PHP RFC: Union Types 2.0
这是一个令人欣慰的非常有意思的新特性, 在Github上已经讨论了很久,并最终形成了解决方案. 它允许显式的定义某个变量的类型,可以是1种或者多个种。以前,我们只能通过 PHPDOC Annotation, 但是在新的PHP 8中,我们可以通过 T1|T2 .. 这样的方式,进行定义了. 但是有以下几点需要特别注意:
1: Void 类型永远不能作为联合类型中的一种,比如,不能这样定义 int|float|void $var;
2: NULL 可以作为联合类型中的一种,比如 int|float|null $var; 这是可以的。 ?int|float $var; 也可以使用这种写法.
3: 每种类型在联合类型声明中只能出现一次, 比如, 你不能定义 int|INT $a; 或者类似 use A as B; A|B $var; 也是不可以的.
其他一些不常用的变化还有一些,我会专门发布详细的介绍文章.
PHP 8的新特性2: JIT 编译器 (Just In Time)
这个是最让人期待并被最多讨论的新特性,主要是因为它将带来显著的性能提升. 尽管还没有任何的官方性能测试报告出炉, 但是我们都确信它的到来. 我们这里主要介绍一下什么是JIT, 以及为何它让人期待.
因为PHP是一种解释性的编程语言, 它不像Java,C或者Rust那样,已经在执行之前编译好了, 直接扔给CPU就能运行了. 那么PHP的JIT引擎,实际上会在运行时编译部分的代码, 让它可以更快的被CPU执行。你可以把它理解为, 系统在执行时,将生成可以被缓存可执行的代码,而下次执行时省去了编译的过程。
JIT的设计思路是: 提供一个检查机制,在执行你的代码时,如果检测到你代码的某一部分以前执行过,那么就会给这部分代码标记为“已编译”, 即Hot. 这部分代码随后会被编译为可被CPU立即执行的经过优化的机器码, 那么以后再运行,就可以直接调用了.
听上去很美好, 但是在实际的应用过程中,将给你的开发增加不小的复杂度,特别是在一些特殊的大计算量的需求场景. 因此我们建议应该继续观察,进行取舍。坚持使用适合自己的技术,而不是强行使用所谓的新技术.
我们会发布专门的详细文章,介绍JIT。
PHP 8新特性3: 属性Attributes V2版
其实就是其他语言中常见的标记信息Annotation. 我们一直通过PHPDOC的方式使用,现在可以直接用在代码中了, 方式是 <<ExampleAttr>>, 对类声明中的某个变量进行声明.
PHP8 新特性: 构造函数的属性声明语法糖
这个特性就是可以减少我们持续的输入一些繁琐的变量声明 。。
例如: 以前要这样写
public class Old{
public $a;
public $b;
public function __construct($a, $b){
$this->a = $a; $this->b = $b;
}
}
新的写法是:
public class NewPhp{
public function __construct(public $a = 'foo', public $b = 'bar' ) { }
}
也没啥新奇的 ...
以下新特性在下一篇中详细介绍
PHP 8新特性: 新的返回值 static
PHP 8新特性: 新的mixed类型