PHP 8 的新特性(續)

新增 fdiv() 函數 prphp

新的 fdiv() 函數的做用相似於 fmod()intdiv() 函數,它們能夠除以 0。視狀況而定,將獲得 INF-INFNANlaravel

新增 get_debug_type() 函數 rfcgit

get_debug_type() 返回變量的類型,聽起來好像跟 gettype() 的做用同樣啊?get_debug_type() 能夠爲數組,字符串,匿名類和對象返回更有用的輸出信息。github

例如,在類\ Foo \ Bar上調用 gettype() 將返回 object,而使用 get_debug_type() 將返回類名。sql

以下表:shell

Value get_debug_type() gettype()
0 int integer
0.1 float double
true bool boolean
false bool boolean
「hello」 string
[] array
null null NULL
A class with name 「Foo\Bar」 Foo\Bar object
An anonymous class class@anonymous object
A resource resource (xxx) resource
A closed resource resource (closed)

能夠在 RFC 中找到 get_debug_type()gettype() 之間的差別的完整列表。數組

新增 get_resource_id() 函數 pr安全

資源是 PHP 中的特殊變量,指的是外部資源。一個示例是 MySQL 鏈接,另外一個是文件句柄。服務器

這些資源中的每個都分配有一個 ID,然而在這以前,若是想獲取某資源的 ID,惟一方法是將資源轉換爲 int:架構

$resourceId = (int) $resource;

PHP 8 添加了 get_resource_id() 函數,使此操做更加明顯且類型安全:

$resourceId = get_resource_id($resource);

Traits 改進中的抽象方法 rfc

Traits 能夠指定必須由使用它們的類所實現的抽象方法。須要注意的是: 在 PHP 8 以前,還沒有驗證這些方法已經實現的標識。如下內容有效:

trait Test {
    abstract public function test(int $input): int;
}

class UsesTrait
{
    use Test;

    public function test($input)
    {
        return $input;
    }
}

當使用 Traits 並實現其抽象方法時,PHP 8 將執行適當的方法進行標識驗證抽象方法是否確實被實現。這意味着您須要編寫如下代碼:

class UsesTrait
{
    use Test;

    public function test(int $input): int
    {
        return $input;
    }
}

token_get_all() rfc 的對象實現

token_get_all() 函數返回一個值數組,該 RFC 使用 PhpToken :: getAll() 方法新增了 PhpToken 類。此實現適用於對象而不是普通值。它消耗更少的內存,而且更易於閱讀。

可變語法調整

在 RFC 中:「統一變量語法 RFC 解決了 PHP 變量語法中的許多不一致之處。該 RFC 旨在解決一小部分被忽略的狀況。」

內部函數的類型註解

許多人 投入 了爲全部內部函數添加適當的類型註釋的工做。這是一個長期存在的問題,最終能夠經過之前版本中對 PHP 所作的全部更改來解決。這意味着內部函數和方法將在反射中具備完整的類型信息。

重大變化

如前所述:這是一個重大更新,所以會有重大變化。最好的辦法是查看 升級 文檔中所列的重大變化的完整列表。

許多這些突破性的更改在之前的 7.* 版本中已被棄用,所以若是你多年來一直保持 PHP 在最新狀態,升級到 PHP 8 應該沒那麼難。

一致的類型錯誤

以前版本在出現類型錯誤時,PHP 中的用戶定義函數已經會拋出 TypeErrors,可是內部函數不會這麼作,而是發出警告並返回 null。從 PHP 8 開始,內部函數的行爲已變得和用戶定義函數一致。

從新分類的引擎警告

許多之前僅觸發警告或通知的錯誤已轉換爲適當的錯誤。如下警告已更改。

  • 變量未定義:Error 異常代替通知

  • 數組索引未定義:警告代替通知

  • 除以零:DivisionByZeroError 異常代替警告

  • 嘗試添加 / 移除非對象的屬性 '% s' :Error 異常代替警告

  • 嘗試修改非對象的屬性 '% s' :Error 異常代替警告

  • 嘗試分配非對象的屬性 '% s' :Error 異常代替警告

  • 從空值建立默認對象:Error 異常代替警告

  • 嘗試獲取非對象的屬性 '% s' :警告代替通知

  • 未定義的屬性:% s:😒% s:警告代替通知

  • 沒法添加元素到數組,由於下一個元素已被佔用:Error 異常代替警告

  • 沒法在非數組變量中銷燬偏移量:Error 異常代替警告

  • 沒法將標量值用做數組:Error 異常代替警告

  • 只有數組和Traversables能夠被解包:TypeError 異常代替警告

  • 爲 foreach () 提供了無效的參數:TypeError 異常代替警告

  • 偏移量類型非法:TypeError 異常代替警告

  • isset 或 empty 中的偏移量類型非法:TypeError 異常代替警告

  • unset 中的偏移量類型非法:TypeError 異常代替警告

  • 數組到字符串的轉換:警告代替通知

  • 資源 ID#% d 用做偏移量,轉換爲整數 (% d):警告代替通知

  • 發生字符串偏移量轉換:警告代替通知

  • 未初始化的字符串偏移量:% d:警告代替通知

  • 沒法將空字符串分配給字符串偏移量:Error 異常代替警告

  • 提供的資源不是有效的流資源:TypeError 異常代替警告

@ 運算符再也不使致命錯誤不提醒

此更改可能會使 PHP 8 以前的版本被 @ 隱藏的錯誤再次顯示出來。請確保在生產服務器上設置了 display_errors=Off

默認錯誤報告級別

如今的默認錯誤報告級別是 E_ALL 而不是以前的除 E_NOTICEE_DEPRECATED 的全部內容。這意味着可能會彈出許多錯誤,這些錯誤之前曾被忽略,儘管在 PHP 8 以前的版本中可能已經存在。

默認 PDO 錯誤模式

根據 RFC:當前 PDO 的默認錯誤模式爲靜默。這意味着當出現 SQL 錯誤時,除非開發人員實現了本身的顯式錯誤處理,不然不會發出任何錯誤或警告,也不會引起任何異常。

此 RFC 將在 PHP 8 中將默認 PDO 錯誤模式 改成 PDO::ERRMODE_EXCEPTION

串聯優先級

在 PHP 7.4 中已廢棄的同時,此變動開始生效。若是你像這樣子書寫:

echo "sum: " . $a + $b;

PHP 之前會如是理解:

echo ("sum: " . $a) + $b;

PHP 8 將這麼作故理解爲此:

echo "sum: " . ($a + $b);

更嚴格的算術和位運算類型檢查 rfc

PHP 8 之前,算術或位運算符用於數組、資源或對象是可接受的。如今再也不可接受,並會拋出一個 類型錯誤 :

[] % [42];
$object + 4;

反射方法簽名變動

反射類的 3 個方法簽名已變動:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

如今已變成:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

升級指南指定,若是要擴展這些類,而且仍想同時支持 PHP 7 和 PHP 8,則容許如下簽名:

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

點關注,不迷路

好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是人才。以前說過,PHP方面的技術點不少,也是由於太多了,實在是寫不過來,寫過來了你們也不會看的太多,因此我這裏把它整理成了PDF和文檔,若是有須要的能夠

點擊進入暗號: PHP+「平臺」

在這裏插入圖片描述

在這裏插入圖片描述


更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣

相關文章
相關標籤/搜索