类常量显式类型 (Typed class constants)
只读属性深拷贝
新增#[\Override] 属性

新增 json_validate() 函数
添加 Randomizer::getBytesFromString() 方法
添加 Randomizer::getFloat() 和 Randomizer::nextFloat() 方法
以及更好的性能、更好的语法、改进类型安全
下面先容部分语法的变革。
类型化类常量
PHP < 8.3
interfaceI{//WemaynaivelyassumethatthePHPconstantisalwaysastring.constPHP='PHP8.2';}classFooimplementsI{//Butimplementingclassesmaydefineitasanarray.constPHP=[];}
PHP 8.3
interfaceI{conststringPHP='PHP8.3';}classFooimplementsI{conststringPHP=[];}//Fatalerror:Cannotusearrayasvalueforclassconstant//Foo::PHPoftypestring
动态获取类常量
PHP < 8.3
classFoo{constPHP='PHP8.2';}$searchableConstant='PHP';var_dump(constant(Foo::class."::{$searchableConstant}"));
PHP 8.3
classFoo{constPHP='PHP8.3';}$searchableConstant='PHP';var_dump(Foo::{$searchableConstant});
只读属性深拷贝
readonly 属性现在可以在魔术方法__clone 中被修正一次,以此实现只读属性的深拷贝。
PHP < 8.3
classPHP{publicstring$version='8.2';}readonlyclassFoo{publicfunction__construct(publicPHP$php){}publicfunction__clone():void{$this->php=clone$this->php;}}$instance=newFoo(newPHP());$cloned=clone$instance;//Fatalerror:CannotmodifyreadonlypropertyFoo::$php
PHP 8.3
classPHP{publicstring$version='8.2';}readonlyclassFoo{publicfunction__construct(publicPHP$php){}publicfunction__clone():void{$this->php=clone$this->php;}}$instance=newFoo(newPHP());$cloned=clone$instance;$cloned->php->version='8.3';
新增#[\Override] 属性
通过给方法添加#[\Override] 属性,PHP 将确保在父类或实现的接口中存在同名的方法。添加该属性表示明确解释覆盖父方法是故意为之,并且简化了重构过程,由于删除被覆盖的父方法将被检测出来。
PHP < 8.3
usePHPUnit\Framework\TestCase;finalclassMyTestextendsTestCase{protected$logFile;protectedfunctionsetUp():void{$this->logFile=fopen('/tmp/logfile','w');}protectedfunctiontaerDown():void{fclose($this->logFile);unlink('/tmp/logfile');}}//Thelogfilewillneverberemoved,becausethe//methodnamewasmistyped(taerDownvstearDown).
PHP 8.3
usePHPUnit\Framework\TestCase;finalclassMyTestextendsTestCase{protected$logFile;protectedfunctionsetUp():void{$this->logFile=fopen('/tmp/logfile','w');}#[\Override]protectedfunctiontaerDown():void{fclose($this->logFile);unlink('/tmp/logfile');}}//Fatalerror:MyTest::taerDown()has#[\Override]attribute,//butnomatchingparentmethodexists
新增 json_validate() 函数
json_validate() 可以检讨一个字符串是否为语法精确的 JSON,比 json_decode() 更有效。
PHP < 8.3
functionjson_validate(string$string):bool{json_decode($string);returnjson_last_error()===JSON_ERROR_NONE;}var_dump(json_validate('{"test":{"foo":"bar"}}'));//true
PHP 8.3
var_dump(json_validate('{"test":{"foo":"bar"}}'));//true
此外,PHP 8.0 的生命周期即将结束。早在 2022 年 11 月 26 日,PHP 8.0 结束了积极支持,而安全支持也将在 PHP 8.3 正式发布三天后 ——2023 年 11 月 26 日停滞。