PHP 8新特性简介
PHP8新特性
新的主要PHP版本PHP8预计将于2020年底发布。它现在处于非常活跃的开发阶段,所以在接下来的几个月里,事情可能会发生很大的变化。
在这篇文章中,我将持续更新预期的内容列表:新特性、性能改进和重大变化。因为PHP8是一个新的主版本,所以您的代码被破坏的几率更高。如果你一直在更新最新的版本,升级应该不会太困难,因为大多数有破坏性的更改在7之前就已经废弃了。*版本。
除了中断更改之外,PHP8还带来了一些不错的新特性,比如JIT编译器和union类型;还有更多!
Uniontypes:联合类型
考虑到PHP的动态类型化特性,在很多情况下联合类型是有用的。联合类型是两个或多个类型的集合,这些类型表示其中一个可以使用。
publicfunctionfoo(Foo|Bar$input):int|float;
注意,void永远不能是union类型的一部分,因为它表示“根本没有返回值”。此外,可以使用|null来编写可为空的联合,也可以使用现有的?符号:
publicfunctionfoo(Foo|null$foo):void; publicfunctionbar(?Bar$bar):void;
JIT
即时编译器承诺显著的性能改进,尽管并不总是在web请求的上下文中。目前还没有任何准确的基准,但它们肯定会到来。
Staticreturntype:静态的返回类型
虽然已经可以返回self,但静态类型直到PHP8才成为有效的返回类型。考虑到PHP的动态类型特性,这一特性对许多开发人员都很有用。
classFoo { publicfunctiontest():static { returnnewstatic(); } }
Weakmaps
在PHP7.4中添加的weakrefsRFC的基础上,在PHP8中添加了WeakMap实现。弱映射包含对对象的引用,这并不会阻止那些对象被垃圾收集。
以orm为例,它们通常实现保存对实体类的引用的缓存,以改进实体之间关系的性能。这些实体对象不能被垃圾回收,只要这个缓存有一个对它们的引用,即使缓存是唯一引用它们的东西。
如果这个缓存层使用弱引用和映射,那么PHP将在没有其他对象引用它们时对这些对象进行垃圾收集。尤其是orm,它可以在一个请求中管理数百个(如果不是数千个)实体;弱映射为处理这些对象提供了一种更好的、对资源更友好的方法。
下面是弱映射的样子,一个来自RFC的例子:
classFoo { privateWeakMap$cache; publicfunctiongetSomethingWithCaching(object$obj):object { return$this->cache[$obj] ??=$this->computeSomethingExpensive($obj); } }
::classonobjects
一个小而有用的新特性:现在可以在对象上使用::class,而不必在对象上使用get_class()。它的工作方式与get_class()相同。
$foo=newFoo(); var_dump($foo::class);
Stringableinterface
Stringable接口可用于键入提示任何字符串或实现了tostring()的内容。而且,无论何时类实现了tostring(),它都会在后台自动实现接口,不需要手动实现。
classFoo { publicfunction__toString():string { return'foo'; } } functionbar(Stringable$stringable){/*…*/} bar(newFoo()); bar('abc');
从接口创建DateTime对象
您已经可以使用DateTime::createfromimmutabledatetime($immutableDateTime)从一个datetime对象创建一个DateTime对象,但是另一种方法比较麻烦。通过添加DateTime::createFromInterface()和datetime::createFromInterface(),现在就有了一种将DateTime和datetime对象相互转换的通用方法。
DateTime::createFromInterface(DateTimeInterface$other); DateTimeImmutable::createFromInterface(DateTimeInterface$other);
重新定义引擎的警告
许多以前只触发警告或通知的错误现在已经转换为正确的错误。以下警告已更改。
- Undefinedvariable:Errorexceptioninsteadofnotice
- Undefinedarrayindex:warninginsteadofnotice
- Divisionbyzero:DivisionByZeroErrorexceptioninsteadofwarning
- Attempttoincrement/decrementproperty‘%s'ofnon-object:Errorexceptioninsteadofwarning
- Attempttomodifyproperty‘%s'ofnon-object:Errorexceptioninsteadofwarning
- Attempttoassignproperty‘%s'ofnon-object:Errorexceptioninsteadofwarning
- Creatingdefaultobjectfromemptyvalue:Errorexceptioninsteadofwarning
- Tryingtogetproperty‘%s'ofnon-object:warninginsteadofnotice
- Undefinedproperty:%s::$%s:warninginsteadofnotice
- Cannotaddelementtothearrayasthenextelementisalreadyoccupied:Errorexceptioninsteadofwarning
- Cannotunsetoffsetinanon-arrayvariable:Errorexceptioninsteadofwarning
- Cannotuseascalarvalueasanarray:Errorexceptioninsteadofwarning
- OnlyarraysandTraversablescanbeunpacked:TypeErrorexceptioninsteadofwarning
- Invalidargumentsuppliedforforeach():TypeErrorexceptioninsteadofwarning
- Illegaloffsettype:TypeErrorexceptioninsteadofwarning
- Illegaloffsettypeinissetorempty:TypeErrorexceptioninsteadofwarning
- Illegaloffsettypeinunset:TypeErrorexceptioninsteadofwarning
- Arraytostringconversion:warninginsteadofnotice
- ResourceID#%dusedasoffset,castingtointeger(%d):warninginsteadofnotice
- Stringoffsetcastoccurred:warninginsteadofnotice
- Uninitializedstringoffset:%d:warninginsteadofnotice
- Cannotassignanemptystringtoastringoffset:Errorexceptioninsteadofwarning
以上就是PHP8新特性简介的详细内容,更多关于php8新特性的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。