新聞動態(tài)
新的PHP8中的改進(jìn)
行業(yè)資訊 發(fā)布者:swl 2020-08-05 09:36 訪問量:170
新的 PHP 主要版本 PHP8 預(yù)計(jì)將于 2020 年底發(fā)布。它現(xiàn)在正處于非常活躍的開發(fā)中,所以在接下來的幾個月里,開發(fā)速度和開發(fā)進(jìn)程可能會有很大的變化。
在這篇文章中,我會羅列出 PHP8 中會發(fā)生的一些改變:新功能、性能改進(jìn)和突破性變化。因?yàn)?PHP8 是一個新的主要版本,所以代碼及語法向下兼容性會更低。如果您一直保持與最新版本保持同步,那么升級應(yīng)該不會太難,因?yàn)榇蠖鄶?shù)突破性的更改在 7.* 版本中都已棄用。
除了突破性的變化,PHP8 還帶來了一些不錯的新特性,比如 JIT 編譯器和 union types,當(dāng)然還有其它更多的特性。
新特性
從新特性開始說起,但是 PHP8 仍在積極開發(fā)中,因此這個清單將隨著時間的推移而增長。
聯(lián)合類型(Union types) RFC
考慮到 PHP 的動態(tài)類型特性,聯(lián)合類型在很多情況下都很有用。聯(lián)合類型是兩個或多個類型的集合,這些類型指示可以使用這兩個類型中的任何一個。
publicfunctionfoo(Foo|Bar$input):int|float;我怎么感覺這個和C語言里的聯(lián)合體有點(diǎn)相似。
請注意,void 永遠(yuǎn)不能是聯(lián)合類型的一部分,因?yàn)樗硎尽案緵]有返回值”。此外,可以使用|NULL或使用現(xiàn)有的?。
publicfunctionfoo(Foo|null$foo):void;
publicfunctionbar(?Bar$bar):void;
JIT RFC
JIT-Just-In-Time 編譯器承諾顯著提高性能,盡管在 Web 應(yīng)用可能沒有較大的好處。在這一點(diǎn)上還沒有任何準(zhǔn)確的基準(zhǔn),但它們肯定會出現(xiàn)的。
靜態(tài)返回類型(Static return type) RFC
雖然已經(jīng)可以返回 self ,但在 PHP8 之前,靜態(tài)不是有效的返回類型??紤]到 PHP 的動態(tài)類型特性,它對許多開發(fā)人員都很有用。
classFoo
{
publicfunctiontest():static{returnnewstatic();}
}
弱映射(Weak maps) RFC
基于在 PHP 7.4 中添加的 WeakRefs RFC 的基礎(chǔ)上,在 PHP 8中 添加了 WeakMap 實(shí)現(xiàn)。WeakMap 包含對對象的引用,這不會阻止這些對象被垃圾回收。
以 ORM 為例,它們經(jīng)常實(shí)現(xiàn)包含對實(shí)體類的引用的緩存,以提高實(shí)體之間關(guān)系的性能。這些實(shí)體對象不能被垃圾回收,只要該緩存有對它們的引用,即使緩存是唯一引用它們的東西。
如果該緩存層改為使用弱引用和映射,則 PHP 將在其他對象不再引用這些對象時對它們進(jìn)行垃圾回收。特別是在 ORM 的情況下,它可以在一個請求中管理數(shù)百個(如果不是數(shù)千個)實(shí)體;弱映射可以提供一種更好、更資源友好的方式來處理這些對象。
以下是 Weak maps 的用法,RFC 中的一個示例:
classFoo{privateWeakMap$cache;publicfunctiongetSomethingWithCaching(object$obj):object{return$this->cache[$obj]??=$this->computeSomethingExpensive($obj);}
}
可以在對象上使用::classRFC
一個小而有用的新特性:現(xiàn)在可以對對象使用::class,而不必對它們使用get_class()。它的工作方式與get_class()相同。
$foo=newFoo();var_dump($foo::class);創(chuàng)建 DateTime 對象的接口
您已經(jīng)可以使用
DateTime::createFromImmutable($immutableDateTime),
從DateTimeImmutable對象創(chuàng)建DateTime
對象,但是反過來很棘手。
通過添加DateTimecreateFromInterface()
和DatetimeImmutable::createFromInterface(),
現(xiàn)在有了一種將DateTime和DateTimeImmutable對象相互轉(zhuǎn)換的通用方法。
DateTime::createFromInterface(DateTimeInterface$other);
DateTimeImmutable::createFromInterface(DateTimeInterface$other);
新的 Stringable 接口 RFC
Stringable接口可用于鍵入提示任何字符串或?qū)崿F(xiàn)__toString()。此外,每當(dāng)類實(shí)現(xiàn)__toString()時,它都會自動在幕后實(shí)現(xiàn)接口,不需要手動實(shí)現(xiàn)它。
classFoo
{
publicfunction__toString():string{return'foo';}
}
functionbar(Stringable$stringable){/* … */}
bar(newFoo());bar('abc');
新的 str_contains() 函數(shù) RFC
有些人可能會說這是早就應(yīng)該實(shí)現(xiàn)的功能,但是我們最終不必再依賴 strpos() 來知道一個字符串是否包含另一個字符串。
以前:
if(strpos('string with lots of words','words')!==false){/* … */}現(xiàn)在:
if(str_contains('string with lots of words','words')){/* … */}新的 fdiv() 函數(shù) PR
新的 fdiv() 函數(shù)的作用類似于 fmod() 和 intdiv() 函數(shù),它們允許被 0 整除。您將得到 INF、-INF 或 NaN ,而不是錯誤,具體取決于大小寫。
新的 get_debug_type() 函數(shù) RFC
get_debug_type() 返回一個變量的類型。聽起來像是 gettype() 可以實(shí)現(xiàn)的功能。get_debug_type() 為數(shù)組、字符串、匿名類和對象返回更有用的輸出。
例如,在類 ooBar 上調(diào)用 gettype() 將返回 Object。使用 get_debug_type() 將返回類名。
可以在 RFC 中找到 get_debug_type() 和 gettype() 之間差異的完整列表。
改進(jìn) traits 里的抽象方法 RFC
traits 可以指定必須由使用它們的類實(shí)現(xiàn)的抽象方法。但是有一個警告:在 PHP8 之前,這些方法實(shí)現(xiàn)的簽名沒有經(jīng)過驗(yàn)證。在以下代碼中有效:
traitTest
{
abstractpublicfunctiontest(int$input):int;
}
classUsesTrait
{
useTest;publicfunctiontest($input){return$input;}
}
在使用 traits 并實(shí)現(xiàn)其抽象方法時,PHP8 將執(zhí)行正確的方法簽名驗(yàn)證。這意味著您需要改寫以下內(nèi)容:
classUsesTrait
{
useTest;publicfunctiontest(int$input):int{return$input;}
}
token_get_all() 的對象接口 RFC
函數(shù)的作用是:返回值的是一個數(shù)組。此 RFC 使用 PhpToken::getall() 方法添加一個 PhpToken 類。此實(shí)現(xiàn)使用對象,而不是普通值。它消耗更少的內(nèi)存,更容易閱讀。
變量語法調(diào)整 RFC
來自 RFC:“統(tǒng)一變量語法RFC解決了PHP變量語法中的一些不一致問題”,這個 RFC 打算解決少數(shù)被忽略的情況。
內(nèi)部函數(shù)的類型批注
很多人都參與到為所有內(nèi)部函數(shù)添加適當(dāng)類型注釋的工作中。這是一個長期存在的問題,通過在以前版本中對 PHP 所做的所有更改,最終可以解決這個問題。這意味著內(nèi)部函數(shù)和方法在反射中將具有完整的類型信息。
統(tǒng)一錯誤類型 RFC
PHP 中的用戶定義函數(shù)已經(jīng)拋出 TypeErrors,但是內(nèi)部函數(shù)沒有拋出 TypeErrors,而是發(fā)出警告并返回 NULL。從 PHP8 開始,內(nèi)部函數(shù)的行為已經(jīng)保持一致。
重新分類 zend engine 報(bào)錯 RFC
許多以前只觸發(fā)警告或通知的錯誤已轉(zhuǎn)換為適當(dāng)?shù)腻e誤。以下警告已更改。
未定義變量:錯誤異常而不是通知。未定義的數(shù)組索引:警告而不是通知。被零除:DivisionByZeroError 異常而不是警告。嘗試遞增/遞減非對象的屬性‘%s’:錯誤異常而不是警告。試圖修改非對象的屬性‘%s’:錯誤異常而不是警告。嘗試分配非對象的屬性‘%s’:錯誤異常而不是警告。從空值創(chuàng)建默認(rèn)對象:錯誤異常而不是警告。正在嘗試獲取非對象的屬性‘%s’:警告而不是通知。未定義屬性:%s::$%s:警告而不是通知。無法將元素添加到數(shù)組,因?yàn)橄乱粋€元素已被占用:錯誤異常而不是警告。無法取消設(shè)置非數(shù)組變量中的偏移量:錯誤異常而不是警告。不能將標(biāo)量值用作數(shù)組:錯誤異常而不是警告。只能解包數(shù)組和遍歷:TypeError 異常而不是警告。為 foreach() 提供的參數(shù)無效:TypeError 異常而不是警告。偏移類型非法:TypeError 異常而不是警告。isset 中的偏移類型非法或?yàn)榭眨篢ypeError 異常而不是警告。未設(shè)置中的偏移類型非法:TypeError 異常而不是警告。數(shù)組到字符串的轉(zhuǎn)換:警告而不是通知。資源 ID#%d 用作偏移量,轉(zhuǎn)換為整數(shù)(%d):警告而不是通知。發(fā)生字符串偏移量轉(zhuǎn)換:警告而不是通知。未初始化的字符串偏移量:%d:警告而不是通知。無法將空字符串分配給字符串偏移量:錯誤異常而不是警告默認(rèn)錯誤報(bào)告級別
現(xiàn)在是 E_ALL,而不是除 E_NOTICE 和 E_DEVERATED 之外的所有內(nèi)容。這意味著可能會彈出許多以前被悄悄忽略的錯誤,盡管在 PHP8 之前可能已經(jīng)存在。
@運(yùn)算符不再忽略致命錯誤
此更改可能會揭示在 PHP8 之前隱藏的錯誤。請確保在生產(chǎn)服務(wù)器上設(shè)置 display_errors=off !
串聯(lián)優(yōu)先級 RFC
雖然在 PHP7.4 中已不推薦使用,但此更改現(xiàn)在生效。如果你這樣寫的話:
echo"sum: ".$a+$b;PHP 以前會這樣解釋它:
echo("sum: ".$a)+$b;PHP 8 將會這樣解釋它:
echo"sum: ".($a+$b);反射方法簽名更改
反射類的三個方法簽名已更改:
ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object,$args);
現(xiàn)已成為:
ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object,...$args);
升級指南指定,如果您擴(kuò)展了這些類,并且仍然希望同時支持 PHP 7和 PHP 8,則允許以下簽名:
ReflectionClass::newInstance($arg=null,...$args);
ReflectionFunction::invoke($arg=null,...$args);
ReflectionMethod::invoke($object,$arg=null,...$args);
其他
在PHP7.*開發(fā)過程中,被用的 RFC,現(xiàn)在已在PHP8中完成。
【推薦閱讀】
國內(nèi)在線旅游服務(wù)網(wǎng)站首頁配色方法同質(zhì)化
多媒體技術(shù)對網(wǎng)站設(shè)計(jì)的意義
關(guān)鍵字:
文章連接: http://www.hsjyfc.com.cn/hyzx/692.html
版權(quán)聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請聯(lián)系我們,我們會立即刪除。如轉(zhuǎn)載請保留