攝影:??? ???在 Unsplash
類型提示被一些人認為是功能的聖杯。所有程式語言都必須具備的一種。 PHP 很長一段時間都沒有這樣的系統,但現在已被大多數開發人員廣泛採用。
也就是說,PHP 的型別系統不如其他語言。許多實現了所謂的泛型。這是在結構和集合之間強制執行類型的能力。例如,在 Java 中,我們可以指定陣列只能包含某種類型的項目,例如字串陣列。
也許有一天我們也會在 PHP 中擁有此功能,但在那之前我們實際上可以透過一些不同的技術來解決這個問題。由於缺乏更好的描述,我將它們稱為 軟類型提示 和 運行時提示。
第一個也是最明顯的類型提示是 PHP 7 中引入的類型提示,並且仍在添加到 PHP 中。類型提示常數僅在 PHP 8.3 中新增。
類型提示有助於傳達需要作為參數傳遞給方法或函數的內容或該方法將傳回的內容。類型提示將影響它們使用的任何類別的簽名,因為擴展具有已建立的類型提示的類別將意味著它們不能被覆蓋。
充分利用類型的類別的範例是:
<?php class Foo { public function bar(array $strings): \Closure { return function (string $string) use ($strings): bool { return in_array($string, $strings); }; } }
當然,我們的類型提示有其局限性,因為如前所述,我們不能使數組全部具有相同的類型,而必須只使用 array 。我們也不能將數字限制為只能是正數或在某個範圍內。
另一種可能是閉包,因為無法在 PHP 的本機類型中描述匿名函數。相反,我們必須使用 Closure 或 callable 。通常,callable 也不允許用作類型。
幸運的是,仍然有一種方法可以使用類型提示來描述這些更複雜的場景。
我們的下一個類型提示是透過 PHPDocs 提供的。如果傳遞方法或傳回錯誤類型,本機類型將在運行時引發異常,但 PHPDoc 類型提示對應用程式的運行時沒有影響。
相反,軟類型提示純粹是在我們使用 VS Code 或 PHPStorm 等 IDE 時為我們提供幫助,它們會為我們檢測這些類型。另一個用例是使用 PHPStan 和隨後的 Rector 等靜態分析工具。
使用軟體類型的最大優點是它可以讓你更精確地描述任何參數、屬性等的型別。例如,我們可以採用前面的類,更容易理解所使用的數組或閉包.
<?php class Foo { /** * @param string[] $strings * @return \Closure(string): bool */ public function bar(array $strings): \Closure { return function (string $string) use ($strings): bool { return in_array($string, $strings); }; } }
確保所有類型使用正確的最佳方法是安裝 PHPStan。從那裡您可能需要至少使用第 5 級。然後可以透過持續整合步驟來檢查類型提示是否正確。
如果您想使用正確的軟類型提示,實際上可以使用一個清單。更好的是,如果您不確定並且想要執行快速測試,可以使用 PHPStan 工具來測試 PHPStan 暗示的所有類型是否正確。
我們支援類型的下一個方法是使用運行時提示。這實際上意味著執行我們自己的程式碼來檢查參數的類型。例如,我們可以檢查陣列是否只包含特定類型的物件。如果沒有,那麼我們拋出一個 InvalidArgumentException。
<?php /** * @param string[] $foo */ function bar(array $foo) { foreach ($foo as $string) { if (! is_string($string)) { throw new \InvalidArgumentException('foo contains non-string value'); } } // rest of the code }
順便說一下,這種技巧有時被稱為防禦性程式設計。看看程式碼範例,這相當麻煩。只是為了簡單地檢查數組是否正確而編寫了很多程式碼。這就是為什麼我們經常求助於函式庫,在本例中是 webmozart/assert 。
composer require webmozart/assert
現在安裝了這個軟體包,我們可以將其縮短為簡單的一行程式碼。
<?php use Webmozart\Assert; /** * @param string[] $foo */ function bar(array $foo) { Assert::allStrings($foo); }
這個函式庫的一大優點是,如果您在 PHPStan 上新增 Assert 擴展,這將有助於分析程式碼時的類型覆蓋率。
總之,掌握 PHP 中的類型提示對於希望編寫乾淨、可維護且可靠的程式碼的開發人員來說是一項基本技能。雖然 PHP 的類型系統仍然缺乏其他語言中的一些功能,例如泛型,但有多種策略可用於強制執行更嚴格的類型 — 無論是透過本機類型提示、PHPDoc 註釋還是運行時檢查。利用 PHPStan 等工具和 Assert 等函式庫可以幫助您確保類型安全,即使在複雜的場景中也是如此。透過將這些技術整合到您的開發工作流程中,您將能夠更好地自信且精確地處理 PHP 的動態特性。
我是 Peter Fox,一位在英國使用 Laravel 的軟體開發人員。感謝您閱讀我的文章,我還有更多內容可以閱讀 https://articles.peterfox.me。我現在也是 GitHub 上的贊助者。如果您想鼓勵我寫更多這樣的文章,請考慮一次性捐款。
以上是掌握 PHP:類型提示技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!