资讯专栏INFORMATION COLUMN

Use PHP7

yearsj / 820人阅读

摘要:说明目前中,计划于月日发布。安全改进密码哈希中的是一个强大的哈希算法,被选为年密码哈希大赛的冠军,将它作为算法的安全替代品。已将设置为非零值已被标记为已弃用。被认为是平台相关的,将被弃用。

说明

目前RC3中,PHP 7.2计划于11月30日发布。新版本将提供新的特性,功能和改进,使我们能够编写更好的代码。在这篇文章中,我将介绍一些PHP 7.2中最有趣的语言特性。

参数类型声明

从PHP 5开始,我们可以在函数的声明中指定期望传递的参数类型。如果给定的值是不正确的类型,那么PHP会抛出一个错误。参数类型声明(也称为类型提示)指定预期要传递给函数或类方法的变量的类型。

例如下面这个例子:

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测试类型提示

对象返回类型声明

如果参数类型声明指定函数参数的预期类型,则返回类型声明指定返回值的预期类型。

返回类型声明指定了一个函数应该返回的变量的类型。
从PHP 7.2开始,我们被允许为对象数据类型使用返回类型声明。这里是一个例子:

class MyClass {
    public $var = "Hello World";
}

$myclass = new MyClass;

function test(MyClass $arg) : object {
    return $arg;
}

echo test($myclass)->var;

以前的PHP版本会导致以下致命错误:

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 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

Argon2是一个强大的哈希算法,被选为2015年密码哈希大赛的冠军,PHP 7.2将它作为Bcrypt算法的安全替代品。
新的PHP版本引入了PASSWORD_ARGON2I常量,现在可以在password_*函数中使用它:

password_hash("password", PASSWORD_ARGON2I);

与仅使用一个成本因素的Bcrypt不同,Argon2需要三个成本因素区分如下:

甲存储器成本它定义了应散列期间被消耗KIB的数(默认值是1 << 10,或1024 KIB,或1 MIB)

甲时间成本定义散列算法的迭代次数(默认为2)

一个并行因子,用于设置散列期间将使用的并行线程数(缺省值为2)

三个新的常量定义了默认的成本因素:

PASSWORD_ARGON2_DEFAULT_MEMORY_COST

PASSWORD_ARGON2_DEFAULT_TIME_COST

PASSWORD_ARGON2_DEFAULT_THREADS

这里是一个例子:

$options = ["memory_cost" => 1<<11, "time_cost" => 4, "threads" => 2];
password_hash("password", PASSWORD_ARGON2I, $options);

有关更多信息,请参阅Argon2密码哈希。

Libsodium作为PHP Core的一部分

从版本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!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26202.html

相关文章

  • PHP7新特性介绍

    摘要:本文内容根据发布时的而来,链接地址特性一览新的操作符之前的写法比较两个数的大小新增的操作符可以直接使用这种方式输出字符这个是方括号里面的问号,因为是字符,博客不支持,发布出来新增的一个函数,具体功能没有深入研究变量类型声明与之相关的一个语 本文内容根据PHP发布时的 new files 而来,链接地址 : PHP 7 new 特性一览 Added ?? operator Adde...

    icyfire 评论0 收藏0
  • PHP 7 修改了什么呢 -- 2

    摘要:风格的构造函数式构造函数,它与类的名称相同,因为它们是在所定义类的方法,现在已过时,并且将在未来被移除。如果的构造仅仅是一个类中定义构造函数,将发出。类实现构造函数方法不受影响。 PHP7 - use语句 从PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)。示例 PHP7 - 错误处理 从PHP7,错误处理和报告已经改变。P...

    leeon 评论0 收藏0
  • [安装] mac安装PHP7经历

    摘要:背景前几天在上跑,由于需要开启多个进程,多进程需要扩展的支持,我之前那个安装的没有这个扩展,就直接卸载了,然后想下载源码编译安装的更高版本,也可以更自由的安装扩展。 背景 前几天在mac上跑workrman,由于workerman需要开启多个进程,多进程需要pcntl扩展的支持,我之前那个brew安装的php71没有这个扩展,就直接卸载了php71,然后想下载源码编译安装php7的更高...

    xiongzenghui 评论0 收藏0
  • isset在php5.6-和php7.0+的一些差异

    摘要:今天在公司实现一个模块功能时写了如下代码居然报错在编译阶段就通不过了错误信息意思很明显但我的代码里面并不是一个表达式啊,这让我百思不得其解我带着疑惑在家里重新敲下了如上代码,编译通过正常运行查看版本而公司的开发机上运行的是那么,为什么 今天在公司实现一个模块功能时写了如下代码: class ProductCategory { const TYPES = [ 1 ...

    oysun 评论0 收藏0
  • PHP5.5 ~ PHP7.2 新特性整理

    摘要:以上例程会输出返回值类型声明增加了对返回类型声明的支持。整数除法函数从移植到可为空类型参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。对于函数来说,不是一个合法的返回值。对于返回值,子类可以拓宽父类的或对象返回值类型到。 PHP5.5 ~ PHP7.2 新特性整理 官方文档:http://php.net/manual/zh/appe... 一、从PHP 5.5.x ...

    mrcode 评论0 收藏0

发表评论

0条评论

yearsj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<