null檢查語句在從空值(nullable)的類型到非空值(non-nullable)類型的轉變中經常用到。下面是個通過了類型檢查器檢查的示例。
在if語句段内部,類型檢查器知道$str是個非空值,是以它能夠傳遞給函takes_string() 。注意null檢查應該使用恒等操作符===和!==,而不是普通的等于操作符 (==和!=),或者轉化為一個boolean類型。如果你不用恒等符号,類型檢查器會報告一個錯誤注6。内置的函數is_null()也是可以工作的。下面是三元表達式的例子:
function takes_nullable_string(?string $str) {
takes_string($str === null ? "(null)" : $str);
// ...
}
當然你還可以使用如下的樣式,即把一個分支流直接切斷:
類型檢查器知道,對函數takes_string()的調用僅僅當$info變量不為空時才會被執行。因為如果它為空,if代碼段将會進入,然後函數會直接傳回。(如果return語句改成throw語句,效果是一樣的。)
如下是個更大的例子,展示了一個更加複雜敏感的流程控制:
在return語句這裡,類型檢查器知道$result是個非空的值,是以傳回類型标注就被滿足了。如果if代碼段進入,那麼一個非空的字元串将會配置設定給$result。如果if代碼段沒有進入,那麼$result必須已經是非空的字元串。
最後,hack有個特殊内置的函數叫做invariant(),你可以使用這個函數來向類型檢查器陳述事實。這個函數使用兩個參數,一個是boolean的表達式,另一個是字元串類型,主要用來向讀者描述問題所在 :
在運作環境中,如果invariant()的第一個參數值被證明是false,那麼一個不變異常(invariantexception)将會觸發。類型檢查器知道這并且推斷出:在invariant()函數後面的調用中,$info不會是個空值。否則的話,一個異常早就被抛出了,而代碼根本就不會執行到這個地方。