实际上,即使PHP 7.4显着提高了性能并提高了代码的可读性,PHP 8仍将是PHP性能的真正里程碑,因为JIT包含的建议已得到批准。
![]() 推荐(免费);PHP7 PHP 7里程版本PHP 7.4在2019年11月28日正式发布。因此,现在该让我们深入研究一些最令人兴奋的新增功能和新功能,这些功能将使PHP更快,更可靠。 。 实际上,即使PHP 7.4显着提高了性能并提高了代码的可读性,PHP 8仍将是PHP性能的真正里程碑,因为JIT包含的建议已得到批准。 无论如何,今天我们正在经历一些我们期望的PHP 7.4最有趣的功能和更改。 因此,在阅读这篇文章之前,请确保保存以下日期:
您可以在RFC官方页面上查看功能和添加项的完整列表。
PHP 7.4中的PHP有何新功能? 在本文中,我们讨论了PHP 7.4最终版本中应在语言中添加的一些更改和功能:
性能提升,数组表达式中引入 Spread 运算符… 自 PHP 5.6 起可用,参数解包是将数组和 Traversable 解包为参数列表的语法。要解压一个数组或 Traversable,必须以 …(3 点)为前缀,如下例所示: function test(...$args) { var_dump($args); }
test(1, 2, 3);然而 PHP 7.4 RFC 建议将此功能扩展到数组中去定义: $arr = [...$args]; Spread 运算符的第一个好处就是性能,RPC 文档指出:
Spread 运算符的一个显着优点是它支持任何可遍历的对象,而该 $parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits); 如果在 PHP 7.3 或更早版本中运行此代码,PHP 会抛出一个 Parse 错误: Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3 相反,PHP 7.4 将返回一个数组 array(5) {
[0]=>
string(6) "banana"
[1]=>
string(6) "orange"
[2]=>
string(5) "apple"
[3]=>
string(4) "pear"
[4]=>
string(10) "watermelon"
}RFC 声明我们可以多次扩展同一个数组。此外,我们可以在数组中的任何位置使用 Spread Operator 语法,因为可以在 spread 运算符之前或之后添加常规元素。因此,以下代码将按预期工作: $arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9]; 也可以将函数返回的数组作为参数,放到新数组中: function buildArray(){
return ['red', 'green', 'blue'];
}
$arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];PHP 7.4 输出以下数组: array(6) {
[0]=>
string(3) "red"
[1]=>
string(5) "green"
[2]=>
string(4) "blue"
[3]=>
string(4) "pink"
[4]=>
string(6) "violet"
[5]=>
string(6) "yellow"
}我们也可以使用生成器: function generator() {
for ($i = 3; $i <= 5; $i++) {
yield $i;
}
}
$arr1 = [0, 1, 2, ...generator()];但不允许通过引用传递的方式。请考虑以下示例: $arr1 = ['red', 'green', 'blue']; $arr2 = [...&$arr1]; 如果我们尝试通过传递引用的方式,PHP 会抛出以下 Parse 错误: Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3 如果第一个数组的元素是通过引用存储的,那么它们也通过引用存储在第二个数组中。这是一个例子: $arr0 = 'red'; $arr1 = [&$arr0, 'green', 'blue']; $arr2 = ['white', ...$arr1, 'black']; 这是我们用 PHP 7.4 获得的: array(5) {
[0]=>
string(5) "white"
[1]=>
&string(3) "red"
[2]=>
string(5) "green"
[3]=>
string(4) "blue"
[4]=>
string(5) "black"
}箭头函数 2.0 (简短闭包) 在 PHP 中,匿名函数被认为是非常冗长且难以实现和难以维护的,RFC 建议引入更简单,更清晰的箭头函数(或简短闭包)语法,这样我们就可以简洁地编写代码。在 PHP 7.4 以前: function cube($n){
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);PHP 7.4 允许使用更简洁的语法,上面的函数可以重写如下: $a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b); 目前,由于语言结构,匿名函数(闭包)可以使用 $factor = 10;
$calc = function($num) use($factor){
return $num * $factor;
};但是在 PHP 7.4 中,父级作用域的值是通过隐式捕获的(隐式按值的作用域进行绑定)。所以我们可以用一行来完成一下这个函数 $factor = 10; $calc = fn($num) => $num * $factor; 父级作用域定义的变量可以用于箭头函数,它跟我们使用 NULL 合并运算符
$username = $_GET['user'] ?? ‘nobody'; 这段代码的作用非常简单:它获取请求参数并设置默认值(如果它不存在)。但是在 RFC 这个例子中,如果我们有更长的变量名称呢? $this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value'; 长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator) $this->request->data['comments']['user_id'] ??= ‘value’; 如果左侧参数的值为 注意,虽然 coalesce 运算符 类型属性 2.0 类型的声明,类型提示,以及指定确定类型的变量传递给函数或类的方法。其中类型提示是在 PHP5 的时候有的一个功能,PHP 7.2 的时候添加了 class User {
public int $id;
public string $name;
}除了 public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; 为什么不支持
因此,我们可以放心使用 所以你可以在 PHP7.4 中这样敲代码: // 静态属性的类型 public static iterable $staticProp; // var 中声明属性 var bool $flagl // 设置默认的值 // 注意,只有 nullable 的类型,才能设置默认值为 null public string $str = "foo"; public ?string $nullableStr = null; // 多个同类型变量的声明 public float $x, $y; 如果我们传递不符合给定类型的变量,会发生什么? class User {
public int $id;
public string $name;
}
$user = new User;
$user->id = 10;
$user->name = [];
// 这个会产生一个致命的错误
Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9弱引用 在这个 RFC 中,提议引入 该提案的作者 Nikita Popov 给出的一个例子: $object = new stdClass;
$weakRef = WeakReference::create($object);
var_dump($weakRef->get());
unset($object);
var_dump($weakRef->get());
// 第一次 var_dump
object(stdClass)#1 (0) {}
// 第二次 var_dump,当 object 被销毁的时候,并不会抛出致命错误
NULL协变返回和逆变参数 协变和逆变
interface Factory {
function make(): object;
}
class UserFactory implements Factory {
// 将比较泛的 object 类型,具体到 User 类型
function make(): User;
}逆变参数: interface Concatable {
function concat(Iterator $input);
}
class Collection implements Concatable {
// 将比较具体的 `Iterator`参数类型,逆变成接受所有的 `iterable`类型
function concat(iterable $input) {/* . . . */}
}预加载 这个 RFC 是由 Dmitry Stogov 提出的,预加载是在模块初始化的时候,将库和框架加载到 OPCache 中的过程,如下图所示
引用他的原话:
预加载由 这在性能上有很大的提升,但是也有一个很明显的缺点,RFC 提出来了
新的自定义对象序列化机制 这是尼基塔·波波夫(Nikita Popov)的另一项建议 ,得到了绝大多数票的批准。 当前,我们有两种不同的机制可以在PHP中对对象进行自定义序列化:
根据Nikita的说法,这两个选项都存在导致复杂且不可靠的代码的问题。 您可以在RFC中深入研究此主题。 在这里,我只提到新的序列化机制应该通过提供两个结合了两个现有机制的新魔术方法 该提案以20票对7票获得通过。 PHP7.4 又将废弃什么功能呢? 更改连接运算符的优先级 目前,在 PHP 中 echo "sum: " . $a + $b; 在 PHP 7.3 中,此代码生成以下警告: Warning: A non-numeric value encountered in /app/types.php on line 4 这是因为这段代码是从左往右开始的,所以等同于: echo ("$sum: " . $a) + $b;针对这个问题,这个 RFC 建议更改运算符的优先级,使 echo "$sum: " . ($a + $b); 这个提案分为两步走:
php7.4性能 出于对PHP 7.4的Alpha预览版性能状态的好奇,我今天针对使用Git构建的PHP 7.3.6、7.2.18、7.1.29和7.0.32运行了一些快速基准测试,并且每个发行版均以相同的方式构建。
在此阶段,PHPBench的7.4性能与PHP 7.3稳定版相当,已经比PHP 7.0快了约30%…当然,与PHP 5.5的旧时代相比,收益甚至更大。
在微基准测试中,PHP 7.4的运行速度仅比PHP 7.3快一点,而PHP-8.0的性能却差不多,至少要等到JIT代码稳定下来并默认打开为止。
在Phoronix测试套件的内部PHP自基准测试中,PHP 7.4的确确实处于PHP 7.3性能水平之上-至少在此Alpha前状态下。 自PHP 7.0起,取得了一些显着的进步,而自PHP5发行缓慢以来,也取得了许多进步。 总结:PHP7.4是一个令人期待的版本,但是PHP8才是整个PHP界最重大的事情。 以上就是PHP 7.4的新增特性之功能,弃用,速度的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
