PHP7.2已于2017年11月30日正式发布。此版本包含新特性、功能和优化,使我们能够编写更好的代码。在本文中,我将介绍PHP7.2中一些最有趣的语言特性。您可以在征求意见页面上查看完整的更改列表。核心改进参数类型声明从PHP5开始,我们可以指定函数参数的预期声明类型。如果传递的参数类型错误,PHP将抛出错误。参数类型声明(也称为类型提示)指定预期传递给函数或类方法的参数类型。这是一个例子:在这段代码中,测试函数需要一个MyClass的实例。不正确的参数数据类型会导致致命错误。Fatalerror:UncaughtTypeError:Argument1passedtotest()mustbeaninstanceofMyClass,stringgiven,calledin/app/index.phponline12anddefinedin/app/index.php:8fromPHP7.2类型提示可用于对象类型数据,此改进允许将通用对象类型用作函数或方法的参数。这是一个例子:classMyClass{public$var='';}classFirstChildextendsMyClass{public$var='MynameisJim';}classSecondChildextendsMyClass{public$var='MynameisJohn';}$firstchild=newFirstChild;$secondchild=newSecondChild;functiontest(object$arg){return$arg->var;}echotest($firstchild);echotest($secondchild);}在上面的例子中,我们两次调用了Test函数,每次都传递了一个不同的对象。这在以前的PHP版本中是前所未有的。Docker中PHP7.0和PHP7.2的测试类型提示。对象返回类型声明如果变量类型指定了函数参数的期望类型,返回值类型也可以指定为期望类型。返回类型声明指定函数应返回的预期类型。从PHP7.2开始,可以使用返回类型声明对象数据类型。这是一个例子:classMyClass{public$var='HelloWorld';}$myclass=newMyClass;函数测试(MyClass$arg):对象{return$arg;}echotest($myclass)->var;beforePHP版本抛出如下致命错误:Fatalerror:UncaughtTypeError:Returnvalueoftest()mustbeaninstanceofobject,instanceofMyClassreturnedin/app/index.php:10当然,PHP7.2的代码打印说“你好世界”。参数类型泛化PHP目前不允许子类与其父类或接口的参数类型有任何差异。这是什么意思?参考如下代码:这里我们省略了子类中的参数类型。在PHP7.0中,会生成以下警告:Warning:DeclarationofMyChildClass::myFunction($myarray)shouldbecompatiblewithMyClass::myFunction(array$myarray)in%sonline8从PHP7.2开始,我们可以忽略子项在不破坏任何代码的情况下键入类。该方案允许我们升级库中的类以使用类型提示,而无需更新其所有子类。列表语法中的尾随逗号在PHP数组的最后一个元素上使用尾随逗号是合法的语法,有时会受到鼓励,这样可以在添加新元素时轻松避免遗漏逗号错误。从PHP7.2开始,我们可以在命名空间分组中使用尾随逗号。有关RFC的直觉和一些示例代码,请参阅列表语法中的尾随逗号。密码哈希中的安全性改进Argon2Argon2是一种强大的哈希算法,曾在2015年密码哈希算法竞赛中获得冠军,PHP7.2将其作为安全Bcrypt算法的替代品。新版PHP引入了PASSWORD_ARGON2I常量,现在可以在password_*系列函数中使用:password_hash('password',PASSWORD_ARGON2I);与Bcrypt只使用一个成本因子不同,Argon2使用三个成本因子来区分如下:哈希算法迭代次数(默认2)用于设置哈希计算的并行因子要使用的并行线程数(默认为2)以下三个新常量定义默认成本因子:=>1<<11,'time_cost'=>4,'threads'=>2];password_hash('密码',PASSWORD_ARGON2I,$options);有关详细信息,请参阅Argon2密码散列。Libsodium是PHP核心的组成部分从7.2版开始,PHP在其核心中包含了Sodium库。Libsodium是一个跨平台和跨语言的库,用于加密、解密、签名、密码散列等。该库以前是通过PECL提供的。有关Libsodium函数的列表,请参阅快速入门。另请参阅PHP7.2:第一种将现代密码学添加到其标准库的编程语言。弃用这里是PHP7.2中弃用的函数和特性的列表,所有这些都将在PHP8.0之后被删除。在PHP5.1中,__autoload函数已被spl_autoload_register取代。现在在编译期间报告弃用通知。抛出致命错误时,将创建$php_errormsg局部变量。PHP7.2应该改用error_get_last和error_clear_last。create_function()可以创建一个带有函数名的函数,将函数参数和函数体作为函数的列表传递。由于安全问题和性能不佳,它被标记为已弃用,取而代之的是鼓励封装。设置为非零值的mbstring.func_overloadini已被标记为已弃用。(unset)cast是一个总是返回null的表达式,没有用。如果传入第二个参数,parse_str()将查询字符串解析成数组,否则解析到本地符号表。出于安全原因,不建议在函数范围内动态设置变量,使用不带第二个参数的parse_str()将抛出弃用通知。gmp_random()依赖于平台,将被弃用。请改用gmp_random_bits()和gmp_random_rage()。each()遍历数组的行为与foreach()非常相似,但foreach()更可取的原因有几个,例如快10倍。在循环中使用前者现在会抛出弃用提示。assert()函数检查给定的断言,如果结果为FALSE,则执行相关处理。带有字符串参数的assert()现在已被弃用,因为它有一个RCE漏洞。zend.assertionini选项关闭断言表达式。$errcontext是一个数组,包含发生错误时的局部变量。它可以用作错误处理程序set_error_handler()函数的最后一个参数。PHP7.2对WordPress用户意味着什么?根据WordPress官方统计页面,截至撰写本文时,只有19.8%的WordPress用户升级到PHP7。只有5%使用PHP7.1。可以看到超过40%的用户还在使用PHP5.6,更可怕的是超过39%的用户在使用不再支持的PHP版本。截至2016年12月,WordPress.org修订了针对PHP5.6用户的官方推荐,建议使用PHP7或更高版本。WordPressPHP7.1统计数据上面的统计数据并不令人愉快,因为PHP7似乎更快。以下是一些统计数据:官方PHP基准测试显示PHP7允许系统每秒执行2个请求,与PHP5.6相比几乎是平均延迟。ChristianVigh还发布了PHP基准测试比较,他发现PHP5.2比PHP7慢了近400%。我们在2018年运行了性能基准测试PHP5.6vsPHP7vsHHVM。与上述基准测试类似,我们发现PHP7.2可以执行与PHP5.6相比,每秒事务(请求)数量几乎增加了三倍。WordPress基准测试WordPress4.9.4PHP5.6基准测试结果:49.18req/secWordPress4.9.4PHP7.0基准测试结果:133.55req/secWordPress4.9.4PHP7.1基准测试结果:134.24req/secWordPress4.9.4PHP7.2基准测试结果结果:148.80req/sec?WordPress4.9.4HHVM基准测试结果:144.76req/sec许多事情在更新时速度较慢,因为需要时间参与并测试所有新的第3方插件和主题以确保它们正常工作。很多时候,事情进展缓慢是因为它们还没有完成。不确定您运行的是哪个版本的PHP?最简单的方法之一是使用工具Pingdom或GoogleChromeDevTools。第一个HTTP请求标头通常会显示您的版本。检查PHP版本,这取决于主机不修改X-Powered-By标头的值。如果你修改它,你可能看不到PHP版本信息,在这种情况下你需要通过FTP上传文件。或者你总是问主人。升级到PHP7.2PHP7.2仍部分未完成,但您可以先试用一下。您可以在类似Docker的环境中测试您的WordPress本地站点或检查您的脚本,还可以从命令行测试和比较不同的PHP版本。结语准备好切换到PHP7.2了吗?但至少希望您已经先过渡到PHP7+。如果您还没有准备好测试它,请更新您的脚本,检查您的代码,并告诉我您对PHP7.2的第一次体验。如需更多现代PHP知识,请访问Laravel/PHP知识社区
