天天看點

《Hack與HHVM權威指南》——1.4.2 沒有标注的代碼

這裡有一種我在早期的清單中沒有提及的類型,即沒有進行類型标注的類型。舉例來說,就像下面函數體内變量$x的類型。

function f($x) {

}

在代碼中,你并沒有書寫任何類型名稱在變量$x前面。那麼在hack的體系裡面,它指代的類型 為“任何”。

類型檢查器會對這種類型進行特殊處理,它永遠不會卷入類型錯誤中,每個在hack中可以存在的值都會符合這種類型“标注”,是以你可以傳遞任何值到上例的函數f()中,而不必擔心會引發類型錯誤。換個角度來說,這種類型的值符合每一種可能的類型标注,是以在f()函數内,你可以拿$x做任何事情,而不會引發類型錯誤。

這聽起來和mixed類型很相似,但是這裡有個非常重要的不同點。每個可能的值都滿足mixed,但是一個mixed類型的值并不滿足每個可能的類型标注。舉例來說,如果你傳遞一個mixed類型的值到一個期待int類型的函數中,你必須確定它是個整型(詳見1.7.2節的内容),或者強制轉化它。

“任何”類型的值在所有hack模式中都以一樣的方式工作。在嚴格模式下,你不能書寫沒有标注的代碼,但是你可以調用被定義在局部或者耦合模式下沒有類型标注的代碼。

在“任何可以标注的都必須标注”的嚴格模式下,嚴格模式的代碼可能使用這種特殊類型的值,但是絕對不允許産生它.