天天看點

《Hack與HHVM權威指南》——1.7 類型提煉

假設你有個?string類型的值,而且準備把這個值傳遞給一個參數類型為string的函數。那麼你怎麼把一個類型(?string)轉化為另外一個類型(string)呢?或者假設你有個object類型的值,它可能實作或沒有實作polarizable接口。同時,如果它實作了這個接口,你還希望調用這個object的方法polarize()。那麼類型檢查器如何才能知道polarize()調用是合法的?

在一個良好組織的代碼中,實作一個值是一個類型同時又是另外一個類型的任務情況非常常見。這些看起來非常瑣碎的事情是你必須拿來安撫類型檢查器的關鍵所在。這是hack能夠在開發前期就捕獲問題的關鍵。這也是hack能夠避免像調用一個不存在的方法、在不恰當的地方找到了一個空值,以及其他一些在php代碼庫開發調試中常見的惱人錯誤這些情況的原因。

你有三種類型檢查器使用的方式對這些類型進行提煉轉化,它們是:是否為空檢查、類似is_integer()的内置類型查詢函數,以及instanceof 。當這些語句在流程控制語句(比如循環語句、條件語句)中被使用時,類型推理引擎将會明确知曉:在不同的流程控制路徑下,類型值也不同。