搜尋
首頁後端開發php教程掌握 PHP:類型提示技術

Mastering PHP: Type Hinting techniques
攝影:??? ???在 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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
絕對會話超時有什麼區別?絕對會話超時有什麼區別?May 03, 2025 am 12:21 AM

絕對會話超時從會話創建時開始計時,閒置會話超時則從用戶無操作時開始計時。絕對會話超時適用於需要嚴格控制會話生命週期的場景,如金融應用;閒置會話超時適合希望用戶長時間保持會話活躍的應用,如社交媒體。

如果會話在服務器上不起作用,您將採取什麼步驟?如果會話在服務器上不起作用,您將採取什麼步驟?May 03, 2025 am 12:19 AM

服務器會話失效可以通過以下步驟解決:1.檢查服務器配置,確保會話設置正確。 2.驗證客戶端cookies,確認瀏覽器支持並正確發送。 3.檢查會話存儲服務,如Redis,確保其正常運行。 4.審查應用代碼,確保會話邏輯正確。通過這些步驟,可以有效診斷和修復會話問題,提升用戶體驗。

session_start()函數的意義是什麼?session_start()函數的意義是什麼?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

為會話cookie設置httponly標誌的重要性是什麼?為會話cookie設置httponly標誌的重要性是什麼?May 03, 2025 am 12:10 AM

設置httponly標誌對會話cookie至關重要,因為它能有效防止XSS攻擊,保護用戶會話信息。具體來說,1)httponly標誌阻止JavaScript訪問cookie,2)在PHP和Flask中可以通過setcookie和make_response設置該標誌,3)儘管不能防範所有攻擊,但應作為整體安全策略的一部分。

PHP會議在網絡開發中解決了什麼問題?PHP會議在網絡開發中解決了什麼問題?May 03, 2025 am 12:02 AM

phpsessions solvathepromblymaintainingStateAcrossMultipleHttpRequestsbyStoringDataTaNthEserVerAndAssociatingItwithaIniquesestionId.1)他們儲存了AtoredAtaserver side,通常是Infilesordatabases,InseasessessionIdStoreDistordStoredStoredStoredStoredStoredStoredStoreDoreToreTeReTrestaa.2)

可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境