本節書摘來自華章出版社《hack與hhvm權威指南》一書中的第2章,第2.2節,作者 owen yamauchi,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
類并不是唯一可以被泛型化的實體。
泛型函數在它的名字和參數清單的在圓括号之間有類型形參的清單。并且它可以像往常一樣被調用,請看下面的例子:
就像這個例子所示 ,泛型函數的類型形參能夠在函數的形參類型和傳回類型這兩個地方使用。
方法也可以是泛型的。如果一個方法存在于一個泛型類或者trait中,它能夠使用其閉合類的類型形參,如下所示:
trait和接口兩者都可以是泛型的。文法和泛型類的文法非常相似,都是在名稱後面放置類型形參的清單:
泛型類可以傳遞它的類型形參到它所實作的接口類型或使用的trait中。
關于類型别名的詳細内容請參見3.2節的内容。它們能夠通過立即添加類型形參清單到它們别名後而完成泛型化。
<code>type matrix<t> = array<array<t>>;</code>
這裡有一個關于類型别名的非常有意思的泛型程式,在這個程式中,你将不會在右邊的位置上使用類型形參。最好的示例就是序列化:
鑒于普通的沒有類型聲明的serialize() api會丢失有關序列化值類型的相關資訊,這個别名使類型檢查器在大量類型的序列化版本中可以進行分辨。這在類型檢查器中并不會引發錯誤,這是因為本質上來說,類型檢查器并沒有對它進行檢查:unserialize()函數沒有傳回類型标注,是以類型檢查器隻是簡單地相信它所做的事情,并且相關傳回值也是正确的(請參見1.4.2節)。
在這裡,類型檢查器知道$unserialized變量是字元串類型。
你還可以對每個序列化的值類型進行檢查,以保證相關的變量類型。