PHP 7.4 中的新功能

| 选择喜欢的代码风格  

短闭包 RFC


短闭包,允许更简洁的单线功能。

array_map(function (User $user) { 
    return $user->id; 
}, $users)
array_map(fn(User $user) => $user->id, $users)

关于短闭包的一些注意事项:

  • 他们可以访问父作用域,不需要使用 use 关键字。
  • $this 就像普通的闭包一样可用。
  • 短闭包只能包含一行,也就是 return 语句。

Typed 属性 RFC


类变量可以是类型提示:

class A
{
    public string $name;
    
    public Foo $foo;
}

type variance 增强 RFC


class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

contravariant arguments

class A
{
    public function contraVariantArguments(ChildType $type)
    { /* … */ }
}

class B extends A
{
    public function contraVariantArguments(ParentType $type)
    { /* … */ }
}

空合并赋值运算符 RFC


//以前
$data['date'] = $data['date'] ?? new DateTime();

//PHP 7.4之后
$data['date'] ??= new DateTime();

数组传播运算符 RFC


现在可以在数组中使用 spread 运算符:

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

请注意,这仅适用于带数字键的数组。

外部函数接口 RFC


外部函数接口,简称 FFI,允许从用户区调用 C 代码。 这意味着 PHP 扩展可以用纯 PHP 编写。

应该指出,这是一个复杂的主题。 您仍然需要 C 知识才能正确使用此功能。

预加载 Preloading RFC


预加载是 PHP 核心的一个惊人的补充,可以带来一些重大的性能改进。

简而言之:如果您今天使用的是框架,则必须在每次请求时加载和重新编译其文件。 预加载允许服务器在启动时在内存中加载 PHP 文件,并使它们永久可用于所有后续请求。

性能提升当然需要付出代价:如果预加载文件的来源发生变化,则必须重新启动服务器。

自定义对象序列化 RFC


此 RFC 添加了两个新的魔术方法:__ serialize__unserialize。 这些方法与 __sleep__wakeup 之间的区别在 RFC 中讨论。

数字文字分隔符 RFC


PHP 7.4 允许使用下划线在视觉上分隔数值。 它看起来像这样:

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88; //PHP 7.4引擎将自动忽略数字下划线

连接优先级 RFC


//有时,你可能这么写PHP代码:
echo "sum: " . $a + $b;

//PHP之前会像这样解释它:
echo ("sum: " . $a) + $b;

//PHP 8 将使它如此解释:
echo "sum :" . ($a + $b);

PHP 7.4 在遇到包含 '.' 的未加表示的表达式时添加了弃用警告。 在 '+''-' 之前。

允许 __toString 中的异常 RFC


以前,无法在 __toString 中抛出异常。 由于一些旧的核心错误处理机制的解决方法,他们被禁止,但 Nikita 指出,这个 “解决方案” 实际上并没有解决它试图解决的问题。

此行为现在已更改,并且可以从 __toString 抛出异常。

不再推荐使用 PHP 短标签 RFC


短开标签 <? 已被弃用,将在 PHP 8 中删除。短回声标记 <?= 不受影响。

array_merge 和 array_merge_recursive UPGRADING


由于添加了扩展运算符,因此使用 array_merge 是有意义的。

$merged = array_merge(...$arrayOfArrays);

为了支持 $arrayOfArrays 为空的边缘情况,array_mergearray_merge_recursive 现在都允许空参数列表。 如果没有传递数组,将返回一个空数组。

strip_tags 可接收数组参数 UPGRADING


//PHP 7.4之前:
strip_tags($string, '

'); //PHP 7.4之后: strip_tags($string, ['a', 'p']);

增加 mb_str_split RFC


此函数提供与 str_split 相同的功能,但在多字节字符串上。

$merged = array_merge(...$arrayOfArrays);

始终启用 ext-hash RFC


正如标题所说,此扩展现在可在所有 PHP 安装中永久使用。

PEAR 默认情况下未启用 EXTERNALS


由于 PEAR 不再维护,核心团队决定使用 PHP 7.4 删除其默认安装。

密码哈希注册表 RFC


对如何使用散列库进行内部更改,以便用户可以更轻松地使用它们。 更具体地说,添加了一个新函数 password_algos,它返回所有已注册密码算法的列表。

左关联三元运算符弃用 RFC


三元运算符在 PHP 中有一些奇怪的怪癖。 此 RFC 为嵌套的三元语句添加了弃用。 在 PHP 8 中,此弃用将转换为编译时错误。

1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok

向后不兼容的变化 UPGRADING


升级 PHP 版本时,您应该始终查看 PHP 完整的 UPGRADING 文档

PHP 7.4 扩展阅读:




发表评论