PHP仍然是其他脚本语言的有力竞争者,主要得益于其核心维护团队的快速更新。自PHP7.0发布以来,社区见证了许多新特性的诞生,极大地改善了开发者在项目中应用PHP的方式。提高PHP应用程序的性能和安全性是这些改进的主要目的。PHP最近实现了另一个里程碑——PHP7.3的发布。新版本带来了一些急需的更新。在本文中,我将讨论PHP7.3的新功能和更新。好消息是您可以安装新版本并在您的测试服务器上自行检查新功能。但正如俗话所说,不要在生产服务器上使用RC版本更新,它可能会破坏您已经运行的应用程序。以下是7.3版本中引入的一些更新,这些更新与以前的版本相比大大提高了PHP7.3的性能。灵活的Heredoc和Nowdoc语法调用函数时允许尾随逗号JSON_THROW_ON_ERRORPCRE2迁移list()赋值参考is_countable函数array_key_first(),array_key_last()Argon2密码散列增强功能已弃用并删除image2wbmp()已弃用并删除不区分大小写常量相同站点CookieFPM更新文件改进Windows下的删除让我们一一讨论上面的每一个更新。灵活的Heredoc和Nowdoc语法Heredoc和Nowdoc语法在处理多行长字符串时非常有用。它要求结束标识符应该是出现在新行上的第一个字符串。//除此之外:$query=<<render('index.html',compact('title','body','comments',));在某些需要构造连续或分组数据的情况下,往往需要使用array_merge()函数来合并数组。您还可以利用尾随逗号:$newArray=array_merge($arrayOne,$arrayTwo,['foo','bar'],);同样,您可以在调用任意方法、函数和闭包时使用此功能。classFoo{publicfunction__construct(...$args){//}publicfunctionbar(...$args){//}publicfunction__invoke(...$args){//}}$foo=newFoo('constructor','bar',);$foo->bar('method','bar',);$foo('invoke','bar',);JSON_THROW_ON_ERROR解析JSON响应数据,用json_encode()和json_decode()两个函数可用。不幸的是,它们都没有正确的错误抛出行为。当json_encode失败时,它只是返回false;当json_decode失败时,它返回null,可以作为一个有效的JSON值。获得错误的唯一方法是调用json_last_error()或json_last_error_msg(),它们将分别返回机器可读和人类可读的全局错误状态。这个RFC提出的解决方案是在JSON函数中添加JSON_THROW_ON_ERROR常量来忽略全局错误状态。当发生错误时,JSON函数会抛出JsonException异常,异常消息(message)为json_last_error()的返回值,异常代码(code)为json_last_error_msg()的返回值。以下是调用示例:json_encode($data,JSON_THROW_ON_ERROR);json_decode("invalidjson",null,512,JSON_THROW_ON_ERROR);//throwJsonException升级PCRE2PHP使用PCRE作为正则表达式引擎。但从PHP7.3开始,PCRE2将发挥其作为新正则引擎的作用。因此,您需要将现有的正则表达式迁移到符合PCRE2的规则。这些规则比以前更具侵入性。请参见以下示例:preg_match('/[\w-.]+/','');此表达式将无法在较新版本的PHP中匹配,并且不会触发警告。因为PCRE2现在严格要求连字符(-)如果需要匹配必须移到末尾或者转义,不能用来表示范围。更新到PCRE210.x后,支持以下功能和更多功能:相对反向引用\g{+2}(相当于现有的\g{-2})PCRE2版本检查(?(VERSION>=x)...)(*NOTEMPTY)和(*NOTEMPTY_ATSTART)告诉引擎不要返回空匹配(*NO_JIT)禁用JIT优化(*LIMIT_HEAP=d)将堆大小限制为dKB(*LIMIT_DEPTH=d)将回溯深度限制设置为d(*LIMIT_MATCH=d)设置匹配次数限制为d参考PHP官方手册中文翻译。list()赋值引用PHP中的list()现在可以给引用赋值,在当前版本中list()不能在赋值中使用引用,在PHP7.3中将允许引用,新改进的语法如下:$array=[1,2];列表($a,&$b)=$array;相当于$array=[1,2];$a=$数组[0];$b=&$数组[1];在PHP7.3中改变,我们也可以使用嵌套的$array=[[1,2],[3,4]]和foreach()方法;foreach($arrayaslist(&$a,$b)){$a=7;}var_dump($array);is_countablefunction在PHP7.2中,使用count()获取对象和数组的数量。如果对象不可数,PHP会抛出警告??。所以你需要检查对象或数组是否可数。PHP7.3提供了一个新函数is_countable()来解决这个问题。此RFC提供了一个新函数is_countable(),它为数组类型的变量或实现Countable接口的实例返回true。before:if(is_array($foo)||$fooinstanceofCountable){//$foo是可数的}after:if(is_countable($foo)){//$foo是可数的}array_key_first(),array_key_last()当前版本的PHP允许reset()、end()和key()等方法通过更改数组的内部指针来获取数组开头和结尾的键和值。现在,为了避免这种内部干扰,PHP7.3引入了一个新函数来解决这个问题:$key=array_key_first($array);获取数组第一个元素的键名$key=array_key_last($array);获取数组最后一个元素的键名看一个例子://关联数组用法$array=['a'=>1,'b'=>2,'c'=>3];$firstKey=array_key_first($array);$lastKey=array_key_last($array);assert($firstKey==='a');assert($lastKey==='c');//索引数组$array的用法=[1=>'a',2=>'b',3=>'c'];$firstKey=array_key_first($array);$lastKey=array_key_last($array);断言($firstKey===1);断言($lastKey===3);译者注:array_value_first()和array_value_last()没有通过RFC投票;因此,PHP7.3中只提供了array_key_first()和array_key_last()函数。参考链接:https://wiki.php.net/rfc/arra...Argon2和Hash密码加密性能增强在PHP的早期版本中,我们加入了Argon2和hash密码加密算法,这是一种使用hash希腊语加密的方法使用现代算法保护密码的算法。它具有三种不同的类型,Argon2i、Argon2d和Argon2id。我们针对Argon2i密码散列和基于密码的密钥生成进行了优化。Argon2d更快并且使用依赖于内存的数据访问。Argon2i使用与内存无关的数据访问。Argon2id是Argon2i和Argon2d的混合体,结合了数据相关和数据无关的内存访问。password_hash():Argon2id现在是推荐在paswword_*函数中使用的Argon2变量。具有自定义成员方法名称的Argon2id与PASSWORD_ARGON2Ipassword_hash('password',PASSWORD_ARGON2ID,['memory_cost'=>1<<17,'time_cost'=>4,'threads'=>2]);密码验证();除了Argon2i,password_verify()函数也适用于Argon2id。password_needs_rehash();此函数还将接受Argon2id散列并在任何变量成员发生更改时返回true。$hash=password_hash('password',PASSWORD_ARGON2ID);password_needs_rehash($hash,PASSWORD_ARGON2ID);//返回假password_needs_rehash($hash,PASSWORD_ARGON2ID,['memory_cost'=>1<<17]);//returntruediscardandRemovedimage2wbmp()这个函数可以输出图像为WBMP格式。另一个名为imagewbmp()的函数也进行单色转换。因此image2wbmp()现在由于重复原因而被弃用,您可以改用imagewbmp()。弃用此函数后,再次调用它会触发弃用警告。移除此函数后,再次调用它会触发致命错误。弃用和删除不区分大小写的常量在以前版本的PHP中,您可以同时使用区分大小写和不区分大小写的常量。但是不区分大小写的常量在使用上会造成一点麻烦。因此,为了解决这个问题,PHP7.3弃用了不区分大小写的常量。原来的情况是:类常量总是“区分大小写”的。使用const关键字定义的全局常量始终“区分大小写”。请注意,这只是常量本身的名称,不包括命名空间名称。PHP的命名空间总是“不区分大小写”的。默认情况下,使用define()函数定义的常量是“区分大小写”的。使用define()函数并将第三个参数设置为true以将常量定义为“不区分大小写”。现在PHP7.3建议弃用并删除以下用法:在PHP7.3中:弃用使用true作为define()的第三个参数。在PHP7.3中:不推荐使用名称与定义大小写不匹配的名称访问不区分大小写的常量。除了true、false和null。Same-siteCookiePHP7.3建议在使用cookie时添加same-site标志。此RFC影响4个系统功能。setcookiesetrawcookiesession_set_cookie_paramssession_get_cookie_params这个效果会在两种情况下起作用。其中一个向函数添加新参数,另一个允许数组中的选项而不是其他单独的选项。boolsetcookie(string$name[,string$value=""[,int$expire=0[,string$path=""[,string$domain=""[,bool$secure=false[,bool$httponly=false]]]]])boolsetcookie(string$name[,string$value=""[,int$expire=0[,array$options]]])//两种方法都可以。FPM更新了FastCGI进程管理器也进行了更新,现在提供了一种新的方式来记录FPM日志。log_limit:设置允许的日志长度,可以超过1024个字符。log_buffering:允许在没有额外缓冲的情况下进行日志记录。decorate_workers_output:当catch_workers_output开启时,系统会关闭渲染输出。改进Windows下的文件删除,如官方文档所述:默认情况下,文件描述符以共享读、写、删除的方式进行操作。这有效地反映了POSIX并允许删除正在使用的文件。但也不是100%相同,不同平台之间可能还是会有一些差异。删除操作后,文件目录仍然存在,直到关闭所有文件操作。结束语之前我们已经讲解了PHP7.3最新版本的特性,包括很多新增和弃用的功能。这些功能在php.net网站上可用,并已合并到master分支中。你现在可以使用这些新特性部署在你自己的服务器上,你也可以打开官方的RFC页面查看每个详细的版本。如果大家对PHP7.3新版本有什么疑问,可以在评论中写下自己的想法。如果您喜欢这篇文章并觉得它有帮助,您可以在推特上关注我以获取更多信息!转自PHP/Laravel开发者社区https://laravel-china.org/top...