前言
本文為《現代 PHP》一書的學習筆記。
環境
- Windows 10
- Wnmp 3.1.0
Hack
Hack 語言是一個伺服器端的語言,Hack 開發者稱其為 PHP 的一種方言。
Facebook 為 Hack 新增了 PHP 所沒有的省時資料結構和介面,更重要的是,Hack 採用了靜態型別來幫助開發者寫出更有預測性和穩定性的程式碼,靜態型別讓開發者在開發階段使用接近即時的型態檢測伺服器,可以更早發現錯誤。
將 PHP 轉變成 Hack
要將 PHP 轉變成 Hack,只要將 <?php
標籤改成 <?hh
標籤即可。
PHP 程式碼範例:
1 |
|
Hack 程式碼範例:
1 | hh |
型態
型態是一個指派給屬性的虛無標籤,用來證明特定的行為存在,並且在預期之中它是根本性的正確。
表達式 $bar = 14
暗示 $bar
變數的數値是一個整數;而 $foo = "bar"
暗示 $foo
變數是一個字串。即使沒有明確的註解,PHP 直譯器仍擁有足夠的能力藉由語法推測出變數的型態。
靜態和動態系統之間最大的差異是何時程式型態會被檢查,以及程式如何檢查其正確性。
靜態型別
編譯器在編譯靜態型別程式時,會在應用程式部署成產品之前,將型態相關的程式錯誤揭露出來,這是好事。但這意味著開發時較長的回饋時間,會拖延開發程序。
靜態型別程式的優勢是它們通常較穩定,因為它們的行為由編譯器的型態檢查系統所驗證過了。但是,仍然需要撰寫獨立的測試來驗證程式行為的正確性。
動態型別
動態型別程式要一直到執行階段才會被檢查,並沒有所謂的編譯時期。動態型別的程式通常是直譯式的,例如每執行一個 PHP 腳本,PHP 程式碼會被直譯器讀取,轉變成一組 opcode
程式碼,並且被執行。
由於 PHP 沒有被編譯,所以錯誤會在執行階段才被揭露,而分離的單元測試就顯得更重要了。
Hack 的型別
Hack 同時實作了靜態和動態型別,並且大部分可向後相容於 PHP。
Hack 使用 HHVM 的 JIT 編譯器,Hack 程式碼會在撰寫時,以獨立的型別檢查器檢查,由 HHVM 讀取,最佳化並快取成中介的位元碼。
Hack 的模式
Hack 可以在三種模式下撰寫,分別是:strict
、partial
或 decl
。
strict
嚴厲模式需要所有程式碼被適當地註解,Hack 型別檢查器會捕捉所有可能的型態相關錯誤,並且無法使用非 Hack 程式碼。
partial
部分模式(預設)允許 Hack 程式碼使用尚未被轉變成 Hack 的 PHP 程式碼,不要求註解所有函式或方法的參數。
decl
宣告模式讓嚴厲模式的 Hack 程式碼呼叫沒有型態的程式碼,例如新版的 Hack 程式碼去呼叫老舊的 PHP 程式碼,此時 PHP 程式碼應當使用宣告模式。