当前位置: 首页 > 后端技术 > PHP

使用PHP7

时间:2023-03-30 05:28:02 PHP

表示目前在RC3中,PHP7.2计划于11月30日发布。新版本将提供新的特性、功能和改进,使我们能够编写更好的代码。在本文中,我将介绍PHP7.2中一些最有趣的语言特性。参数类型声明从PHP5开始,我们可以在函数声明中指定我们希望传递的参数类型。如果给定值的类型不正确,则PHP将抛出错误。参数类型声明(也称为类型提示)指定预期传递给函数或类方法的变量类型。例如下面的例子:classMyClass{public$var='HelloWorld';}$myclass=newMyClass;functiontest(MyClass$myclass){return$myclass->var;}echotest($myclass);在这段代码中,测试函数需要一个MyClass的实例。不正确的数据类型将导致以下致命错误:Fatalerror:UncaughtTypeError:Argument1passedtotest()mustbeaninstanceofMyClass,stringgiven,calledin/app/index.phponline12anddefinedin/app/index.php:8由于PHP7.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中测试Docker中的类型提示对象返回类型声明返回类型声明指定返回值的预期类型if参数类型声明指定函数参数的预期类型。返回类型声明指定函数应返回的变量类型。从PHP7.2开始,我们可以使用对象数据类型的返回类型声明。这是一个例子:beforePHP版本导致以下致命错误:Fatalerror:UncaughtTypeError:Returnvalueoftest()mustbeaninstanceofobject,instanceofMyClassreturnedin/app/index.php:10当然,在PHP7.2中,此代码响应“HelloWorld”。参数类型扩展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需要三个成本因子区分如下:A.MemoryCost它定义了在哈希过程中应该消耗的KIB数量(默认为1<<10,或1024KIB,或1MIB)时间成本定义哈希算法的迭代次数(默认为2)并行度因子用于设置哈希期间将使用的并行线程数(默认为2)三个新常量定义默认成本因子:PASSWORD_ARGON2_DEFAULT_MEMORY_COSTPASSWORD_ARGON2_DEFAULT_TIME_COSTPASSWORD_ARGON2_DEFAULT_THREADS这是一个例子:$options=['memory_cost'=>1<<11,'time_cost'=>4,'threads'=>2];password_hash('密码',PASSWORD_ARGON2I,$options);有关详细信息,请参阅Argon2密码散列。Libsodium作为PHP核心的一部分从版本7.2开始,PHP将钠库合并到核心中。Libsodium是一个跨平台和跨语言的库,用于加密、解密、签名、密码散列等。以前可通过PECL获得。有关Libsodium函数的文档列表,请参阅库快速入门指南。另请参阅PHP7.2:第一种将现代密码学添加到其标准库的编程语言。弃用以下是PHP8.0中弃用的函数和特性列表,不晚于PHP8.0:__autoload函数在PHP5.1中已被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(),因为它会打开RCE漏洞。zend.assertionINI选项可用于防止评估断言表达式。$errcontext是一个数组,其中包含生成错误时存在的局部变量。它作为使用set_error_handler()函数设置的错误处理程序的最后一个参数传递。尾注翻译自https://kinsta.com/blog/php-7-2/ScriptMakerDayDayUp!