1. 程式人生 > 實用技巧 >PHP 8 的新特性(續)

PHP 8 的新特性(續)

新增 fdiv() 函式 pr

新的 fdiv() 函式的作用類似於 fmod()intdiv() 函式,它們可以除以 0。視情況而定,將得到 INF-INFNAN

新增 get_debug_type() 函式 rfc

get_debug_type() 返回變數的型別,聽起來好像跟 gettype() 的作用一樣啊?get_debug_type() 可以為陣列,字串,匿名類和物件返回更有用的輸出資訊。

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

如下表:

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: