####本節書摘來自華章出版社《hack與hhvm權威指南》一書中的第1章,第1.8節,作者 owen yamauchi,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在一個hack代碼庫中,即使類型檢查器并沒有報告錯誤,但是在運作環境仍然可能有錯誤發生。這種情況最明顯的情形就是通過耦合模式:因為在耦合模式下,代碼并不會進行類型檢查。是以對函數的調用傳遞了錯誤類型的參數值,也是有可能的。
在未來的釋出版本中,hhvm的運作環境類型檢查将會更加嚴格,但是目前的版本中,在運作環境中對類型标注的檢查隻是部分支援。
首先,hhvm會忽略屬性值的類型标注,你可以對一個類型标注的屬性賦予任何喜歡的值。hhvm并不會抱怨。
參數的類型标注行為和php的類型提示的一樣,一旦違反了規則,一個可捕捉的緻命錯誤将會産生注9。對傳回類型标注也是一樣的。
違反規則時,你可以把任何參數或者傳回類型标注産生的緻命錯誤變成一個警告錯誤,方法就是在最前面加個@符号。這稱為一個軟(soft)标注。對于已經存在的代碼添加新的标注時,“軟标注”僅僅是個過渡性的措施(具體參見10.2.2節的内容)。最好不要在新代碼中使用它,而對于已經存在的硬标注,當然也不要改成“軟”的。
對于參數類型标注和傳回類型标注來說,hack類型标注的一些細節并沒有被執行:
任何對原始類型、object類型、num或者arraykey的标注都是按原型執行的。
傳回類型void并沒有被執行。這就是說,如果一個函數的傳回類型是void,那麼它可以傳回一個真實的值,這在程式真正運作時并不會引發任何錯誤。
對于tuple和shape的标注就是array。内部的類型并沒有檢查。
枚舉标注被執行檢查,就好像它們是枚舉基礎類型一樣。在運作環境中,值并沒有被檢查,以確定它們是枚舉的合法值。
泛型标注并沒有和它的類型形參一起被執行檢查。這就是說,一個array的類型标注被執行為array,内部類型并沒有被檢查。
nullable類型被正确檢測了。