在大多數靜态類型的語言之中,一個本地變量出現後就會被定義為某種類型。然後,這個變量将在整個生命周期内儲存這種類型的值。本例中的代碼可以是c++或者java,不論哪種情況,這裡都會引發一個類型錯誤。因為x被聲明為一個int類型,是以永遠不能把非int類型的值指派給它:
int x = 10;
x = "a string"; // 錯誤
這并不是一個hack中的例子,就像php一樣,本地變量在hack中可以不用聲明類型,你可以簡單地通過賦一個值給它來建立一個本地變量。你還可以對任何本地變量指派新的值,而不用在意這個本地變量原本的類型是什麼:
$x = 10;
$x = "a string"; // 正确
關鍵的不同點是:在hack中,本地變量本身是沒有類型的,它所存放的值是有類型的。
在本程式中的每個點上,類型檢查器都知道在那個點每個變量所存放的值的類型。如果它發現一個新的值被賦給了這個變量,那麼它将及時更新關于這個變量存放的值類型的知識點。