《現代 PHP》學習筆記(廿五):Hack

前言

本文為《現代 PHP》一書的學習筆記。

環境

  • Windows 10
  • Wnmp 3.1.0

Hack

Hack 語言是一個伺服器端的語言,Hack 開發者稱其為 PHP 的一種方言。

Facebook 為 Hack 新增了 PHP 所沒有的省時資料結構和介面,更重要的是,Hack 採用了靜態型別來幫助開發者寫出更有預測性和穩定性的程式碼,靜態型別讓開發者在開發階段使用接近即時的型態檢測伺服器,可以更早發現錯誤。

將 PHP 轉變成 Hack

要將 PHP 轉變成 Hack,只要將 <?php 標籤改成 <?hh 標籤即可。

PHP 程式碼範例:

1
2
<?php
echo "I'm PHP";

Hack 程式碼範例:

1
2
<?hh
echo "I'm Hack";

型態

型態是一個指派給屬性的虛無標籤,用來證明特定的行為存在,並且在預期之中它是根本性的正確。

表達式 $bar = 14 暗示 $bar 變數的數値是一個整數;而 $foo = "bar" 暗示 $foo 變數是一個字串。即使沒有明確的註解,PHP 直譯器仍擁有足夠的能力藉由語法推測出變數的型態。

靜態和動態系統之間最大的差異是何時程式型態會被檢查,以及程式如何檢查其正確性。

靜態型別

編譯器在編譯靜態型別程式時,會在應用程式部署成產品之前,將型態相關的程式錯誤揭露出來,這是好事。但這意味著開發時較長的回饋時間,會拖延開發程序。

靜態型別程式的優勢是它們通常較穩定,因為它們的行為由編譯器的型態檢查系統所驗證過了。但是,仍然需要撰寫獨立的測試來驗證程式行為的正確性。

動態型別

動態型別程式要一直到執行階段才會被檢查,並沒有所謂的編譯時期。動態型別的程式通常是直譯式的,例如每執行一個 PHP 腳本,PHP 程式碼會被直譯器讀取,轉變成一組 opcode 程式碼,並且被執行。

由於 PHP 沒有被編譯,所以錯誤會在執行階段才被揭露,而分離的單元測試就顯得更重要了。

Hack 的型別

Hack 同時實作了靜態和動態型別,並且大部分可向後相容於 PHP。

Hack 使用 HHVM 的 JIT 編譯器,Hack 程式碼會在撰寫時,以獨立的型別檢查器檢查,由 HHVM 讀取,最佳化並快取成中介的位元碼。

Hack 的模式

Hack 可以在三種模式下撰寫,分別是:strictpartialdecl

strict

嚴厲模式需要所有程式碼被適當地註解,Hack 型別檢查器會捕捉所有可能的型態相關錯誤,並且無法使用非 Hack 程式碼。

partial

部分模式(預設)允許 Hack 程式碼使用尚未被轉變成 Hack 的 PHP 程式碼,不要求註解所有函式或方法的參數。

decl

宣告模式讓嚴厲模式的 Hack 程式碼呼叫沒有型態的程式碼,例如新版的 Hack 程式碼去呼叫老舊的 PHP 程式碼,此時 PHP 程式碼應當使用宣告模式。