投票通過,PHP 8 確認引入Union Types 2.0
關於是否要在PHP 8中引入Union Types的投票已於近日結束,投票結果顯示有61名PHP開發組成員投了贊成票,5名投了反對票。因此根據投票結果,官方已確認將會在PHP 8中引入Union Types 2.0。
▲ (還留意到鳥哥在投票中投了反對票~)
關於Union Types的具體討論可在GitHub查看,下面我們來簡單了解一下Union Types(聯合類型)。
根據官方的介紹,Union Types(聯合類型)支持接收多個不同類型的值,而不僅僅是單一類型。PHP 目前已經支持兩種特殊的聯合類型:
Type
ornull
,使用特殊的?Type
語法array
orTraversable
,使特殊的iterable
類型
不過PHP 目前尚不支持任意的聯合類型。如要使用,需通過 phpdoc 註釋的幫助,示例如下:
classNumber{ /** * @var int|float $number */private $number; /** * @param int|float $number */publicfunctionsetNumber($number){ $this->number = $number; } /** * @return int|float */publicfunctiongetNumber(){ return$this->number; } }
根據數據統計的結果,在開源生態以及PHP自身的標準庫中使用聯合類型非常普遍。官方表示,如果PHP能支持聯合類型,將會允許我們將更多類型信息從phpdoc遷移至函數簽名,這具有以下常見的優點:
- 類型實際上是強制執行的,因此可以及早發現錯誤。
- 因為它們是強制性的,所以類型信息不太可能變得過時或遺漏邊緣情況。
- 在繼承過程中會檢查類型,以執行里氏替換原則(Liskov Substitution Principle)
- 可通過反射獲得類型信息。
- 語法比phpdoc 簡潔。
泛型之後,聯合類型可以說是目前類型聲明系統中最大的“缺口”。
提案
聯合類型使用 T1|T2|…
語法,可在所有接受的類型中使用:
classNumber{ private int|float $number; publicfunctionsetNumber(int|float $number): void{ $this->number = $number; } publicfunctiongetNumber(): int|float{ return$this->number; } }[object Object]
支持的類型
聯合類型支持PHP 當前支持的所有類型:空類型、可空聯合類型、false pseudo-type、重複和冗餘類型。
類型語法
除特殊void
類型外,PHP的類型語法現在可以通過以下語法來描述:
type: simple_type | "?" simple_type | union_type ; union_type: simple_type "|" simple_type | union_type "|" simple_type ; simple_type: "false"# only legal in unions | "null"# only legal in unions | "bool" | "int" | "float" | "string" | "array" | "object" | "iterable" | "callable"# not legal in property types | "self" | "parent" | namespaced_name ;