關於是否要在 PHP 8 中引入 Union Types 的投票已於近日結束,投票結果顯示有 61 名 PHP 開發組成員投了贊成票,5 名投了反對票。
也留意到鳥哥在投票中投了反對票~
因此根據投票結果,官方已確認將會在PHP 8 中引入Union Types 2.0。
關於 Union Types 的具體討論可在 GitHub 查看,我們來簡單了解一下 Union Types(聯合類型)。
根據官方的介紹,Union Types(聯合類型)支援接收多個不同類型的值,而不僅僅是單一類型。 PHP 目前已經支援兩種特殊的聯合型別:
·Type or null,使用特殊的Type語法
# # ·
array or Traversable,讓特殊的iterable型別
不過PHP 目前尚未支援任意的組合型別。如要使用,需透過 phpdoc 註解的協助,範例如下:<pre style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 14px; line-height:
1.5em; white-space: pre-wrap; overflow-wrap: break-word;">class Number { /**
* @var int|float number; /**
* @param int|float number) { number;
} /**
* @return int|float */
public function getNumber () { return $this->number;
}
}
,在開源生態以及 PHP 本身的標準函式庫中使用聯合型別非常普遍。官方表示,如果PHP 能支援聯合類型,將會允許我們將更多類型資訊從phpdoc 遷移至函數簽名,這具有以下常見的優點: ·
類型實際上是強制執行的,因此可以及早發現錯誤。 ·
因為它們是強制性的,所以類型資訊不太可能變得過時或遺漏邊緣情況。 ·
在繼承過程中會檢查類型,以執行里氏替換原則(Liskov Substitution Principle)# ·
可透過反射獲得型別資訊。 ·
文法比 phpdoc 簡潔。
泛型之後,聯合類型可以說是目前類型宣告系統中最大的「缺口」。
****提案****
聯合類型使用T1T2… 語法,可在所有接受的類型中使用:<pre style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 14px; line-height:
1.5em; white-space: pre-wrap; overflow-wrap: break-word;">class Number { private int|float number): void { number;
} public function getNumber (): int|float { return $this->number;
}
}
聯合類型支援PHP 目前支援的所有類型:空白類型、可空聯合類型、false pseudo-type、重複和冗餘類型。
****類型語法****
PHP入門教程###,歡迎線上學習! ###