这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
PHP 7.4 的GA版今天正式发布了。PHP 7.4发布后,PHP 7.3或其它的PHP 7版本都可以升级到PHP 7.4版。
PHP 7.4 的主要特性包括以下几个,
- 短闭包函数(
short closure) - 预加载提交性能
- 属性类型限定
Improved type variance(不会翻译)- 三元运算简写
- 数组展开运算
- 新增类的魔术方法:
serialization - 数字分隔符
- 运算优先顺序
- 允许在
__toString中抛出异常 - 支持反射引用
- 新增字节分割函数
- 移除
php短标签 - 弃用左关联运算符
- 不再向后兼容的变更
短闭包函数
短闭包函数可以减少冗余代码:
array_map(function (User $user) {
return $user->id;
}, $users)
array_map(fn(User $user) => $user->id, $users)
需要注意几点:
- 短闭包可以直接访问闭包函数外面的变量,所以不需要再写
use关键词 - 以
fn关键词开始 $this可以像普通的闭包一样使用- 短闭包只有一行代码,仅仅做返回声明使用,不允许使用
return关键词
还可以使用更严格类型的方式
$ids = array_map(fn(User $user): int => $user->id, $user);
预加载
PHP预加载可以极大的提高性能
优点:在PHP 7.4以前,如果你使用了框架来开发,每次请求文件就必须加载和重新编译。预加载在框架启动时在内存中加载文件,而且在后续请求中永久有效。
缺点:性能的提升会在其他方面花费很大的代价,每次预加载的文件发生改变时,框架需要重新启动。
属性类型限定
class A
{
public string $name;
public Foo $foo;
}
不得不说,PHP越来越接近Java等强类型语言
Improved type variance
协变返回类型:
class ParentType {}
class ChildType extends ParentType {}
class A
{
public function covariantReturnTypes(): ParentType
{ /* … */ }
}
class B extends A
{
public function covariantReturnTypes(): ChildType
{ /* … */ }
}
依赖(是不是很熟悉):
class ParentType {}
class ChildType extends ParentType {}
class A
{
public function covariantReturnTypes(): ParentType
{ /* … */ }
}
class B extends A
{
public function covariantReturnTypes(): ChildType
{ /* … */ }
}
简写三元运算符
在目前> PHP 7以后的写法:
$data['date'] = $data['date'] ?? new DateTime();
在PHP 7.4你可以这样写:
$data['date'] ??= new DateTime();
数组展开运算
合并数组到另一个数组中,返回一维数组
$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6 ,7];
// [0, 1, 2, 3, 4, 5, 6, 7]
注意 :只对数字索引有效
新增类的魔术方法
RFC添加了两个新的魔术方法__serialize和__unserialize
数字分隔符
允许使用下划线更直观的分隔数值
$unformattedNumber = 107925284.88;
$formattedNumber = 107_925_284.88;
运算优先顺序
PHP 7.4之前,如果你这样写:
echo "sum: " . $a + $b;
PHP会解析为:
echo ("sum: " . $a) + $b;
PHP 8将会解析为:
echo "sum :" . ($a + $b);
__toString中抛出异常
支持反射引用
PHP 7.4将会新增ReflectionReference 类
移除php短标签
<?将会在PHP 8中移除,<?=会继续保留
弃用左关联运算符
PHP遗留了一些奇怪的怪癖,比如
1 ? 2 : 3 ? 4 : 5; // 将会在 PHP 7.4 中废弃,在 PHP 8中会抛出编译错误
(1 ? 2 : 3) ? 4 : 5; // 正确
不再向后兼容的变更
- 弃用在没有父类的情况下调用
parent:: - 调用
var_dump打印DateTime和DateTimeImmutableshi'实例,将不再保留对象上的可访问属性 openssl_random_pseudo_bytes会在调用错误时抛出异常- 序列化
PDO和PDOStatement实例将会生成一个Exception而不是PDOException异常 - 调用
get_object_vars()打印ArrayObject实例将会返回ArrayObject自己的属性,而不是被包裹的数组或对象的值,
数组强制转换不受影响
226 次点击
加入收藏
下一篇:Proxmox VE 6.1 正式版发布
