目前RC3中,PHP 7.2计划于11月30日发布。新版本将提供新的特性,功能和改进,使咱们可以编写更好的代码。在这篇文章中,我将介绍一些PHP 7.2中最有趣的语言特性。php
从PHP 5开始,咱们能够在函数的声明中指按期望传递的参数类型。若是给定的值是不正确的类型,那么PHP会抛出一个错误。参数类型声明(也称为类型提示)指定预期要传递给函数或类方法的变量的类型。html
例以下面这个例子:git
class MyClass { public $var = 'Hello World'; } $myclass = new MyClass; function test(MyClass $myclass){ return $myclass->var; } echo test($myclass);
在这个代码中,测试函数须要MyClass的一个实例。不正确的数据类型将致使如下致命错误:算法
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8
因为PHP 7.2 类型提示能够与对象数据类型一块儿使用,而且这种改进容许声明通用对象做为函数或方法的参数。这里是一个例子:编程
class MyClass { public $var = ''; } class FirstChild extends MyClass { public $var = 'My name is Jim'; } class SecondChild extends MyClass { public $var = 'My name is John'; } $firstchild = new FirstChild; $secondchild = new SecondChild; function test(object $arg) { return $arg->var; } echo test($firstchild); echo test($secondchild);
在这个例子中,咱们调用了两次测试函数,每次调用都传递一个不一样的对象。在之前的PHP版本中这是不可能的。数组
Docker命令
在Docker中使用PHP 7.0和PHP 7.2测试类型提示安全
若是参数类型声明指定函数参数的预期类型,则返回类型声明指定返回值的预期类型。php7
返回类型声明指定了一个函数应该返回的变量的类型。
从PHP 7.2开始,咱们被容许为对象数据类型使用返回类型声明。这里是一个例子:app
class MyClass { public $var = 'Hello World'; } $myclass = new MyClass; function test(MyClass $arg) : object { return $arg; } echo test($myclass)->var;
之前的PHP版本会致使如下致命错误:dom
Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10
固然,在PHP 7.2中,这个代码回应了“Hello World”。
PHP目前不容许子类和它们的父类或接口之间的参数类型有任何差别。这意味着什么?
考虑下面的代码:
<?php class MyClass { public function myFunction(array $myarray) { /* ... */ } } class MyChildClass extends MyClass { public function myFunction($myarray) { /* ... */ } }
这里咱们省略了子类中的参数类型。在PHP 7.0中,这段代码会产生如下警告:
Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8
自PHP 7.2以来,咱们被容许在不破坏任何代码的状况下省略子类中的类型。这个建议将容许咱们升级类来在库中使用类型提示,而不须要更新全部的子类。
数组中最后一项以后的尾随逗号是PHP中的有效语法,有时为了方便追加新项目并避免因为缺乏逗号而致使解析错误,鼓励使用该语法。自PHP 7.2以来,咱们被容许在分组命名空间中使用尾随逗号。
请参阅列表语法中的尾随逗号以便在此RFC处得到更近的视图以及一些代码示例。
Argon2是一个强大的哈希算法,被选为2015年密码哈希大赛的冠军,PHP 7.2将它做为Bcrypt算法的安全替代品。
新的PHP版本引入了PASSWORD_ARGON2I常量,如今能够在password_*函数中使用它:
password_hash('password', PASSWORD_ARGON2I);
与仅使用一个成本因素的Bcrypt不一样,Argon2须要三个成本因素区分以下:
三个新的常量定义了默认的成本因素:
这里是一个例子:
$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2]; password_hash('password', PASSWORD_ARGON2I, $options);
有关更多信息,请参阅Argon2密码哈希。
从版本7.2开始,PHP将钠库归入核心。Libsodium 是一个跨平台和跨语言的库,用于加密,解密,签名,密码散列等等。之前经过 PECL 提供。有关Libsodium功能的文档列表,请参阅库快速入门指南。另请参阅PHP 7.2:将现代加密技术添加到其标准库中的第一种编程语言。
如下是PHP 8.0 不推荐使用的函数和功能列表,不晚于PHP 8.0:
该__autoload功能已被取代由spl_autoload_register在PHP 5.1。如今,在编译期间遇到弃用通知。
在$ php_errormsg中时,抛出一个非致命错误变量是在局部范围内建立。因为应该使用PHP 7.2 error_get_last和error_clear_last。
create_function()容许建立一个带有生成函数名称的函数,一系列参数和正文代码做为参数提供。因为安全问题和性能不佳,已将其标记为已弃用,并鼓励使用附件。
已将 mbstring.func_overload ini设置为非零值已被标记为已弃用。
(unset)cast 是一个老是返回null的表达式,被认为是无用的。
若是提供了第二个参数,parse_str()会将查询字符串解析为数组,若是不使用,则解析为本地符号表。因为出于安全缘由不鼓励在函数范围内设置变量,使用不带第二个参数的 parse_str() 将抛出弃用通知。
gmp_random() 被认为是平台相关的,将被弃用。使用 gmp_random_bits() 和 gmp_random_rage()来代替。
each() 被用来像 foreach() 那样迭代一个数组,可是 foreach() 有几个缘由是可取的,包括快10倍。如今,在循环的第一个呼叫中将会抛弃。
所述断言函数检查给定的断言,并采起适当的行动,若是结果是FALSE。带有字符串参数的 assert() 的使用如今已被弃用,由于它会打开一个 RCE 漏洞。该 zend.assertion INI 选项可用于防止断言表达式的评价。
$ errcontext是包含生成错误时存在的局部变量的数组。它做为使用 set_error_handler() 函数设置的错误处理程序的最后一个参数传递。
翻译自 https://kinsta.com/blog/php-7-2/
Script Maker Day Day Up!