1. 
          

          1. 新聞動(dòng)態(tài)

            新的PHP8中的改進(jìn)

            行業(yè)資訊 發(fā)布者:swl 2020-08-05 09:36 訪(fǎng)問(wèn)量:117

            新的 PHP 主要版本 PHP8 預計將于 2020 年底發(fā)布。它現在正處于非?;钴S的開(kāi)發(fā)中,所以在接下來(lái)的幾個(gè)月里,開(kāi)發(fā)速度和開(kāi)發(fā)進(jìn)程可能會(huì )有很大的變化。

            在這篇文章中,我會(huì )羅列出 PHP8 中會(huì )發(fā)生的一些改變:新功能、性能改進(jìn)和突破性變化。因為 PHP8 是一個(gè)新的主要版本,所以代碼及語(yǔ)法向下兼容性會(huì )更低。如果您一直保持與最新版本保持同步,那么升級應該不會(huì )太難,因為大多數突破性的更改在 7.* 版本中都已棄用。

            除了突破性的變化,PHP8 還帶來(lái)了一些不錯的新特性,比如 JIT 編譯器和 union types,當然還有其它更多的特性。

            新特性

            從新特性開(kāi)始說(shuō)起,但是 PHP8 仍在積極開(kāi)發(fā)中,因此這個(gè)清單將隨著(zhù)時(shí)間的推移而增長(cháng)。

            聯(lián)合類(lèi)型(Union types) RFC

            考慮到 PHP 的動(dòng)態(tài)類(lèi)型特性,聯(lián)合類(lèi)型在很多情況下都很有用。聯(lián)合類(lèi)型是兩個(gè)或多個(gè)類(lèi)型的集合,這些類(lèi)型指示可以使用這兩個(gè)類(lèi)型中的任何一個(gè)。

            publicfunctionfoo(Foo|Bar$input):int|float;我怎么感覺(jué)這個(gè)和C語(yǔ)言里的聯(lián)合體有點(diǎn)相似。

            請注意,void 永遠不能是聯(lián)合類(lèi)型的一部分,因為它表示“根本沒(méi)有返回值”。此外,可以使用|NULL或使用現有的?。

            publicfunctionfoo(Foo|null$foo):void;

            publicfunctionbar(?Bar$bar):void;

            JIT RFC

            JIT-Just-In-Time 編譯器承諾顯著(zhù)提高性能,盡管在 Web 應用可能沒(méi)有較大的好處。在這一點(diǎn)上還沒(méi)有任何準確的基準,但它們肯定會(huì )出現的。

            靜態(tài)返回類(lèi)型(Static return type) RFC

            雖然已經(jīng)可以返回 self ,但在 PHP8 之前,靜態(tài)不是有效的返回類(lèi)型??紤]到 PHP 的動(dòng)態(tài)類(lèi)型特性,它對許多開(kāi)發(fā)人員都很有用。

            classFoo

            {

            publicfunctiontest():static{returnnewstatic();}

            }

            弱映射(Weak maps) RFC

            基于在 PHP 7.4 中添加的 WeakRefs RFC 的基礎上,在 PHP 8中 添加了 WeakMap 實(shí)現。WeakMap 包含對對象的引用,這不會(huì )阻止這些對象被垃圾回收。

            以 ORM 為例,它們經(jīng)常實(shí)現包含對實(shí)體類(lèi)的引用的緩存,以提高實(shí)體之間關(guān)系的性能。這些實(shí)體對象不能被垃圾回收,只要該緩存有對它們的引用,即使緩存是唯一引用它們的東西。

            如果該緩存層改為使用弱引用和映射,則 PHP 將在其他對象不再引用這些對象時(shí)對它們進(jìn)行垃圾回收。特別是在 ORM 的情況下,它可以在一個(gè)請求中管理數百個(gè)(如果不是數千個(gè))實(shí)體;弱映射可以提供一種更好、更資源友好的方式來(lái)處理這些對象。

            以下是 Weak maps 的用法,RFC 中的一個(gè)示例:

            classFoo{privateWeakMap$cache;publicfunctiongetSomethingWithCaching(object$obj):object{return$this->cache[$obj]??=$this->computeSomethingExpensive($obj);}

            }

            可以在對象上使用::classRFC

            一個(gè)小而有用的新特性:現在可以對對象使用::class,而不必對它們使用get_class()。它的工作方式與get_class()相同。

            $foo=newFoo();var_dump($foo::class);創(chuàng )建 DateTime 對象的接口

            您已經(jīng)可以使用

            DateTime::createFromImmutable($immutableDateTime),

            從DateTimeImmutable對象創(chuàng )建DateTime

            對象,但是反過(guò)來(lái)很棘手。

            通過(guò)添加DateTimecreateFromInterface()

            和DatetimeImmutable::createFromInterface(),

            現在有了一種將DateTime和DateTimeImmutable對象相互轉換的通用方法。

            DateTime::createFromInterface(DateTimeInterface$other);

            DateTimeImmutable::createFromInterface(DateTimeInterface$other);

            新的 Stringable 接口 RFC

            Stringable接口可用于鍵入提示任何字符串或實(shí)現__toString()。此外,每當類(lèi)實(shí)現__toString()時(shí),它都會(huì )自動(dòng)在幕后實(shí)現接口,不需要手動(dòng)實(shí)現它。

            classFoo

            {

            publicfunction__toString():string{return'foo';}

            }

            functionbar(Stringable$stringable){/* … */}

            bar(newFoo());bar('abc');

            新的 str_contains() 函數 RFC

            有些人可能會(huì )說(shuō)這是早就應該實(shí)現的功能,但是我們最終不必再依賴(lài) strpos() 來(lái)知道一個(gè)字符串是否包含另一個(gè)字符串。

            以前:

            if(strpos('string with lots of words','words')!==false){/* … */}現在:

            if(str_contains('string with lots of words','words')){/* … */}新的 fdiv() 函數 PR

            新的 fdiv() 函數的作用類(lèi)似于 fmod() 和 intdiv() 函數,它們允許被 0 整除。您將得到 INF、-INF 或 NaN ,而不是錯誤,具體取決于大小寫(xiě)。

            新的 get_debug_type() 函數 RFC

            get_debug_type() 返回一個(gè)變量的類(lèi)型。聽(tīng)起來(lái)像是 gettype() 可以實(shí)現的功能。get_debug_type() 為數組、字符串、匿名類(lèi)和對象返回更有用的輸出。

            例如,在類(lèi) ooBar 上調用 gettype() 將返回 Object。使用 get_debug_type() 將返回類(lèi)名。

            可以在 RFC 中找到 get_debug_type() 和 gettype() 之間差異的完整列表。

            改進(jìn) traits 里的抽象方法 RFC

            traits 可以指定必須由使用它們的類(lèi)實(shí)現的抽象方法。但是有一個(gè)警告:在 PHP8 之前,這些方法實(shí)現的簽名沒(méi)有經(jīng)過(guò)驗證。在以下代碼中有效:

            traitTest

            {

            abstractpublicfunctiontest(int$input):int;

            }

            classUsesTrait

            {

            useTest;publicfunctiontest($input){return$input;}

            }

            在使用 traits 并實(shí)現其抽象方法時(shí),PHP8 將執行正確的方法簽名驗證。這意味著(zhù)您需要改寫(xiě)以下內容:

            classUsesTrait

            {

            useTest;publicfunctiontest(int$input):int{return$input;}

            }

            token_get_all() 的對象接口 RFC

            函數的作用是:返回值的是一個(gè)數組。此 RFC 使用 PhpToken::getall() 方法添加一個(gè) PhpToken 類(lèi)。此實(shí)現使用對象,而不是普通值。它消耗更少的內存,更容易閱讀。

            變量語(yǔ)法調整 RFC

            來(lái)自 RFC:“統一變量語(yǔ)法RFC解決了PHP變量語(yǔ)法中的一些不一致問(wèn)題”,這個(gè) RFC 打算解決少數被忽略的情況。

            內部函數的類(lèi)型批注

            很多人都參與到為所有內部函數添加適當類(lèi)型注釋的工作中。這是一個(gè)長(cháng)期存在的問(wèn)題,通過(guò)在以前版本中對 PHP 所做的所有更改,最終可以解決這個(gè)問(wèn)題。這意味著(zhù)內部函數和方法在反射中將具有完整的類(lèi)型信息。

            統一錯誤類(lèi)型 RFC

            PHP 中的用戶(hù)定義函數已經(jīng)拋出 TypeErrors,但是內部函數沒(méi)有拋出 TypeErrors,而是發(fā)出警告并返回 NULL。從 PHP8 開(kāi)始,內部函數的行為已經(jīng)保持一致。

            重新分類(lèi) zend engine 報錯 RFC

            許多以前只觸發(fā)警告或通知的錯誤已轉換為適當的錯誤。以下警告已更改。

            未定義變量:錯誤異常而不是通知。未定義的數組索引:警告而不是通知。被零除:DivisionByZeroError 異常而不是警告。嘗試遞增/遞減非對象的屬性‘%s’:錯誤異常而不是警告。試圖修改非對象的屬性‘%s’:錯誤異常而不是警告。嘗試分配非對象的屬性‘%s’:錯誤異常而不是警告。從空值創(chuàng )建默認對象:錯誤異常而不是警告。正在嘗試獲取非對象的屬性‘%s’:警告而不是通知。未定義屬性:%s::$%s:警告而不是通知。無(wú)法將元素添加到數組,因為下一個(gè)元素已被占用:錯誤異常而不是警告。無(wú)法取消設置非數組變量中的偏移量:錯誤異常而不是警告。不能將標量值用作數組:錯誤異常而不是警告。只能解包數組和遍歷:TypeError 異常而不是警告。為 foreach() 提供的參數無(wú)效:TypeError 異常而不是警告。偏移類(lèi)型非法:TypeError 異常而不是警告。isset 中的偏移類(lèi)型非法或為空:TypeError 異常而不是警告。未設置中的偏移類(lèi)型非法:TypeError 異常而不是警告。數組到字符串的轉換:警告而不是通知。資源 ID#%d 用作偏移量,轉換為整數(%d):警告而不是通知。發(fā)生字符串偏移量轉換:警告而不是通知。未初始化的字符串偏移量:%d:警告而不是通知。無(wú)法將空字符串分配給字符串偏移量:錯誤異常而不是警告默認錯誤報告級別

            現在是 E_ALL,而不是除 E_NOTICE 和 E_DEVERATED 之外的所有內容。這意味著(zhù)可能會(huì )彈出許多以前被悄悄忽略的錯誤,盡管在 PHP8 之前可能已經(jīng)存在。

            @運算符不再忽略致命錯誤

            此更改可能會(huì )揭示在 PHP8 之前隱藏的錯誤。請確保在生產(chǎn)服務(wù)器上設置 display_errors=off !

            串聯(lián)優(yōu)先級 RFC

            雖然在 PHP7.4 中已不推薦使用,但此更改現在生效。如果你這樣寫(xiě)的話(huà):

            echo"sum: ".$a+$b;PHP 以前會(huì )這樣解釋它:

            echo("sum: ".$a)+$b;PHP 8 將會(huì )這樣解釋它:

            echo"sum: ".($a+$b);反射方法簽名更改

            反射類(lèi)的三個(gè)方法簽名已更改:

            ReflectionClass::newInstance($args);

            ReflectionFunction::invoke($args);

            ReflectionMethod::invoke($object,$args);

            現已成為:

            ReflectionClass::newInstance(...$args);

            ReflectionFunction::invoke(...$args);

            ReflectionMethod::invoke($object,...$args);

            升級指南指定,如果您擴展了這些類(lèi),并且仍然希望同時(shí)支持 PHP 7和 PHP 8,則允許以下簽名:

            ReflectionClass::newInstance($arg=null,...$args);

            ReflectionFunction::invoke($arg=null,...$args);

            ReflectionMethod::invoke($object,$arg=null,...$args);

            其他

            在PHP7.*開(kāi)發(fā)過(guò)程中,被用的 RFC,現在已在PHP8中完成。



            關(guān)鍵字:

            文章連接: http://www.gostscript.com/hyzx/692.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.