PHP 7.4简介:性能,功能,弃用

PHP 7.4对您意味着什么?


PHP不断发展,他们刚刚发布了最新的PHP 7.4更新,其中充满了新功能。 正如我们在过去的PHP 7版本中已经证明的那样-性能和速度不断提高。 最令人兴奋的新功能之一是预加载 。 由于简化了常见的代码行,因此可以加快脚本执行速度,并引入了拥有更快,更干净的代码的功能。

PHP负责人充分考虑了听众的意见和要求,并完美地回答了他们。 从那以后,他们一直在不断更改代码,以便在编程语言之间切换时更直观,更舒适。

PHP在所有网站中的78.9%以上使用。 据W3techs称 ,使用PHP的最受欢迎的网站是Wikipedia,Pinterest和Facebook,仅举几例。

如果我们明确地查看运行PHP的WordPress网站,将PHP 5和7进行比较,就会发现速度提高了一倍。 WordPress驱动的网站通过使用最新的PHP版本获得最大收益。

图片

该图说明了有关积极使用PHP的网站的真相。 是4000万。 实时网站足以吸引您的注意力? 现在有多少人在使用PHP。 此外,PHP 7.4与PHP 7.3相比已经具有更好的测试结果,并具有改进的性能和其他生活质量升级。

下图显示了新旧PHP版本的总体基准测试 。 测试的一些标准包括易用性,速度和性能。

图片

PHP 7.4的新增功能?


自2016年以来,PHP7一直在不间断地发布年度更新。 每年,他们提供新功能,新增功能,并编写更简洁的代码,从而使该语言对于在其网站上运行的用户来说更加可靠和用户友好。

让我们深入研究一下PHP 7.4的新增功能所做的一些更改。 有关完整列表,请在此处查看他们的变更日志。

预装


让我们谈谈代码。 使用框架或库时,必须在每次请求时加载并链接其文件。 预加载是指可以将框架和库加载到OPCache中的时间。 它允许服务器在启动过程中加载PHP文件并将其存储在内存中,并使它们可用于将来的任何请求。 谈论让事情进展迅速!

预加载由特定的php.ini指令运行: opcache.preload 。 它具有PHP脚本编译器,并在服务器启动时执行。 它也可以用于预加载更多文件并选择包含或编译它们。

太棒了 但是,如果曾经更改过预加载文件的源,则必须重新启动服务器。 预加载的文件也永远保留在OPCache内存中。
但是,如果您需要再次使用它们,这些预加载的文件将继续可用于将来的任何请求。

数组表达式中的扩散运算符


早在发布PHP 5.6时,PHP就开始支持参数解包(扩展运算符),但是现在,在7.4中,我们可以将此功能与数组表达式一起使用。 参数解压缩是一种将数组和Traversables解压缩到参数列表中的语法。 而且,要这样做,只需要在前面加上...(3个点)即可。

让我们来看这个例子:

$animals = ['dog', 'cat']; $animalkingdom = ['lion', 'elephant', ...$animals, 'giraffe']; // ['lion', 'elephant', 'dog', 'cat', 'giraffe']; 

现在,我们可以简单地使用Spread Operator语法从任意数组中的任意位置扩展数组。

这是一个更长的例子:

 $num1 = [1, 2, 3]; $num2 = [...$num1]; // [1, 2, 3] $num3 = [0, ...$num1]; // [0, 1, 2, 3] $num4 = array(...$num1, ...$num2, 111); // [1, 2, 3, 1, 2, 3, 111] $num5 = [...$num1, ...$num1]; // [1, 2, 3, 1, 2, 3] 

不仅如此,您还可以在函数中使用它。 看看这个例子:

 function getNum() { return ['a', 'b']; } $num6 = [...getNum(), 'c']; // ['a', 'b', 'c'] $num7 = [...new NumIterator(['a', 'b', 'c'])]; // ['a', 'b', 'c'] function arrGen() { for($i = 11; $i < 15; $i++) { yield $i; } } $num8 = [...arrGen()]; // [11, 12, 13, 14] 

此外,您现在可以将函数直接返回的数组和生成器解压缩到新数组中。

一个代码示例如下所示:

 function getAnimals(){ return ['dog', 'cat', 'elephant']; } $num1 = [...getAnimals(), 'lion', 'tiger', 'giraffe']; 

在PHP 7.4中,它将显示:

 array(6) { [0]=> string(3) "dog" [1]=> string(3) "cat" [2]=> string(8) "elephant" [3]=> string(4) "lion" [4]=> string(5) "tiger" [5]=> string(7) "giraffe" } 

使用这个新的数组表达式,散布运算符应该比7.3 array_merge具有更好的性能。 这是因为传播运算符是一种语言结构,而array_merge是一个函数。 同样因为散布运算符支持实现可遍历的对象,而array_merge仅支持数组。

需要注意的一些重要事项,由于不支持字符串键,因此只能使用索引数组。 如果使用此键,一旦找到字符串键,就会在屏幕上引发可恢复的错误。
7.4的另一项荣耀是删除了array_merge。 告别可怕的索引移位!

例如,让我们在下面看这个冗长的数组合并:

 $array = ['banana, 'orange']; $array[2] = 'orange'; $array[1] = 'apple'; //shifting var_dump($array); // prints array(3) { [0]=> string(6) "banana" [1]=> string(5) "apple" [2]=> string(6) "orange" 

7.4的另一个好处是使用了generator函数。 生成器函数的工作方式与普通函数类似,只是生成器函数不返回值,而是生成所需数量的值。

查看以下示例代码:

 function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $num1 = [0, 1, 2, ...generator()]; 

参考不足


现在,PHP 7.4具有WeakReference类,请勿将其与类WeakRedWeakref扩展混淆。

WeakReferences使程序员可以调用对对象的引用。 这很有用,因为它不会阻止对象被破坏。 它们对于实现类似缓存的结构很有帮助。

 WeakReference { /* Methods */ public __construct ( void ) public static create ( object $referent ) : WeakReference public get ( void ) : ?object } 

协变参数和协变返回


当前,PHP主要使用不变的参数类型和返回类型。 这意味着,如果方法的参数或返回类型为X,则子类型参数或返回类型也必须为X。

现在,在PHP 7.4中,它建议在参数和返回类型上允许协变 (从特定到通用的顺序)和逆变 (颠倒顺序)。

这是两个示例:

协变返回类型示例:

 interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; } 

变量参数类型示例:

 interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // accepts all iterables, not just Iterator function concat(iterable $input) {/* . . . */} } 

键入属性2.0


从PHP 5开始,类型提示已成为一项可用功能,允许您指定预期传递给函数或类的变量的类型。 在PHP 7.2迁移中,对象数据类型的添加使人们希望将来会有更多可用。 未来就是现在。

在新的7.4中,PHP能够支持以下类型列表:

 bool, int, float, string, array, object, iterable, self, parent any class or interface name ?type // where "type" may be any of the above 

请注意, 类型可以在类中使用,并且不必具有与参数和返回类型一致的父类型。

另外,请注意,不支持voidcallableVoid被删除,因为它没有用并且语义不明确; 可调用 ,因为它的行为与上下文有关。

让我们看看更多示例。

这是为PHP 7.3编写的类:

 class User { /** @var int $id */ private $id; /** @var string $name */ private $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } public function getId(): int { return $this->id; } public function setId(int $id): void { $this->id = $id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } } 

在PHP 7.4中,在不牺牲任何类型安全性的情况下,现在可以编写一个简单的类,如下所示:

 class User { public int $id; public string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } } 

以下是7.4现在支持的所有类型的一些示例:

 class Example { public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; // Types are also legal on static properties public static iterable $staticProp; // Types can also be used with the "var" notation var bool $flag; // Typed properties may have default values (more below) public string $str = "foo"; public ?string $nullableStr = null; // The type applies to all properties in one declaration public float $x, $y; // equivalent to: public float $x; public float $y; } 

箭头功能2.0


PHP中的匿名函数往往冗长冗长,即使它们仅执行简单的操作也是如此。 这部分归因于大量的语法模板,部分归因于需要手动导入使用的变量。

这使得使用简单闭包的代码难以阅读甚至难以理解。

让我们看一下您将在PHP 7.3中使用的一些代码:

 function array_values_from_keys($arr, $keys) { return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys); } 

现在,这是PHP 7.4的更简洁语法:

 function array_values_from_keys($arr, $keys) { return array_map(fn($x) => $arr[$x], $keys); } 

因此,箭头函数现在具有以下简单形式:

 fn(parameter_list) => expr 

在下面,您可以并排看到两个函数$ fn1(7.3)和$ fn2(7.4)的示例。 它们具有相同的结果,但外观不同:

 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

如果箭头函数嵌套,这也将起作用:

 $z = 1; $fn = fn($x) => fn($y) => $x * $y + $z; 

在此,外部函数捕获$ z 。 然后,内部函数还从外部函数捕获$ z。 在7.4中,外部作用域可以在内部函数中使用。 这是7.3无法做到的。

箭头函数语法允许使用各种函数,例如variadics,默认值,参数和返回类型,以及按引用传递和返回。 同时保持整洁,可读的外观。 以下是所有可用的有效箭头功能:

 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

要注意的一件事是箭头函数的优先级最低。 参见示例:

 fn($x) => $x + $y // is fn($x) => ($x + $y) // not (fn($x) => $x) + $y 

弃用


与7.4合并时发生了许多弃用情况。 以下列表是针对不推荐使用的功能的简短概述。 您可以在这里找到更详细的说明:

  • 魔术报价遗留
  • array_key_exists()与对象
  • FILTER_SANITIZE_MAGIC_QUOTES过滤器
  • 反射export()方法
  • mb_strrpos() ,编码为第三个参数
  • implode()参数顺序混合
  • 从非静态闭包中解除此$的绑定
  • hebrevc()函数
  • convert_cyr_string()函数
  • money_format()函数
  • ezmlm_hash()函数
  • r estore_include_path()函数
  • allow_url_include ini指令

以下是两步弃用,需要注意的一些重要事项。

更改串联运算符的优先级


当前,“。”,“ +”和“-”运算符的优先级都相等。 这些运算符的任何组合都将简单地从左到右求解。

让我们看看PHP 7.3中的以下代码:

 echo "sum: " . $a + $b; // would be evaluated left-to-right echo ("sum: " . $a) + $b; // could also look like this 

在PHP 7.4中,“ +”和“-”将优先于“。”。 因此加法和减法将始终在字符串之前执行。 如下所示:

 echo "sum: " . $a + $b; // would be executed as if the code were as follows. echo "sum :" . ($a + $b); 

这个分两步的提案旨在减少出错的可能性,提高直觉。 当前,PHP 7.4处于第一阶段,已弃用了非括号的表达式“ +”,“-”和“”。 在等待最终投票/ PHP 8中发生的更改时。

左联想三元运算符


与大多数其他语言不同,PHP中的三元运算符是左关联的,而不是右关联的。 这不仅不常见,而且在不同语言之间切换的程序员也感到困惑。 PHP 7.4建议删除左关联性,而要求使用括号。

让我们看下面的代码:

 return $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'; 

在大多数其他语言中,它将被解释为:

 return $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 4 ? 'four' : 'other'))) 

在PHP中,它被解释为:

 return ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other'; 

这可能会导致错误,因为它通常不是预期的。

通过一个单独的两步提议,PHP 7.4已实现括号的显式使用作为弃用警告,并有望在以后的版本中发生编译时错误。

结论


恰逢假期,PHP 7.4为所有PHP开发人员带来了新功能,并改善了生活质量。

WordPress网站肯定会从这些改进中受益,与以前的版本相比,使用PHP 7.4的用户可以期望更快的执行时间和更少的内存使用。

通过添加一流的属性类型声明和类型提示,箭头合并功能以及可笑的更高速度,7.4必将提高工作流程的速度和质量。

Source: https://habr.com/ru/post/zh-CN483128/


All Articles