<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                使用`declare(strict_types=1)`來獲得更健壯的PHP代碼 ## 介紹 如果您是PHP開發人員,您可能在某些PHP文件的開頭看到過`declare(strict_types=1)`語句。 我第一次看到這個聲明時,我不知道它是做什么的。我以為這是某種注釋,或者是我之前的舊PHP語法,但我錯了(大錯特錯!)。 在這篇文章中,我們將介紹什么是`declare(strict_types=1)`,以及它如何幫助您提高PHP代碼的類型安全性。 ## declare(strict_types=1) 是什么? `declare(strict_types=1)`是一個啟用PHP嚴格模式并在PHP應用程序中強制嚴格類型的語句。 它是在PHP 7.0中添加的,當時類型聲明系統首次在PHP中實現。這意味著它可以在PHP 8項目中使用,因此您可以開始在代碼中充分利用嚴格類型。 當你使用這個語句時,PHP會對函數的參數和返回類型進行嚴格的類型檢查。這意味著如果一個函數需要某種類型的參數或返回值,如果使用了錯誤的類型,PHP將拋出錯誤。這也適用于具有指定類型提示和返回類型的PHP閉包和箭頭函數。 讓我們舉一個不使用`declare(strict_types=1)`的簡單例子: ```php function add(int $a, int $b): int { return $a + $b; } ``` 現在假設我們用字符串參數調用這個函數: ``` echo add('1', '2'); // Output: // 3 ``` PHP會很高興地將字符串參數轉換為整數并返回結果`3`。 在某些情況下,您可能完全不介意這種行為。但它可能會產生一些您沒有預料到的意外后果,并可能導致應用程序中的錯誤。 然而,讓我們假設我們想在這個例子中使用`declare(strict_types=1)`。我們可以通過在文件頂部添加以下語句來實現這一點: ``` declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; } ``` 現在,如果我們用字符串參數調用`add`函數,PHP將拋出一個錯誤: ``` echo add('1', '2'); // Output: // Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given ``` 正如我們在這里看到的,PHP拋出了一個錯誤,因為`add`函數期望傳遞整數,但卻接收到了字符串。 類似地,如果啟用了嚴格的類型檢查,并且我們試圖從方法返回錯誤的數據類型,PHP也會拋出錯誤。例如,假設我們的`add`函數現在接受浮點數而不是整數,并且我們沒有啟用嚴格的類型檢查: ``` function add(float $a, float $b): int { return $a + $b; } ``` 我們可以這樣調用函數: ``` echo add(1.25, 2.25); // Output: // 3 ``` 你發現輸出中的問題了嗎? 我們應該得到的答案是`3.5`。然而,因為我們已經將返回類型定義為`int`,所以我們已經將浮點數(應該返回的)轉換為整數,并失去了精度。可以想象,這可能會在我們應用程序的其他部分導致一些問題,我們正在使用這個結果,并且可能需要精度。 現在讓我們通過使用`declare(strict_types=1)`來解決這個問題: ``` declare(strict_types=1); function add(float $a, float $b): int { return $a + $b; } ``` 我們可以這樣調用函數: ``` echo add(1.25, 2.25); // Output: // Fatal error: Uncaught TypeError: add(): Return value must be of type int, float returned ``` 正如我們所看到的,通過啟用嚴格的類型檢查,我們可以發現函數沒有返回與返回類型聲明匹配的正確數據類型。這很好,因為它可以突出顯示我們代碼中可能存在的錯誤,而我們并不知道。然后,我們可以采取必要的步驟: * 如果返回類型不正確,請更新它們 * 如果類型提示不正確,請更新類型提示 * 如果數據類型不正確,則更新函數體以返回正確的數據類型 * 修復調用函數的代碼中可能向其傳遞錯誤數據類型的任何錯誤 ## 我應該使用`declare(strict_types=1)`嗎? 我個人認為,在所有的PHP文件中使用`declare(strict_types=1)`是一個好主意。我曾經認為僅僅有類型提示和返回類型就足以確保傳遞正確的數據類型,但我現在改變了主意。當我使用`declare(strict_types=1)`時,我對我的代碼更有信心,并且由于使用它而發現了一些bug(特別是當將它添加到舊代碼庫時)。 由于PHP是一種動態類型的語言(而不是嚴格類型的語言),這意味著如果你不想的話,你根本不需要指定任何返回類型或類型提示。相反,PHP將在運行時為您確定類型。然而,即使有可能這樣做,我還是強烈建議不要這樣做。如果你不能在代碼中使用嚴格類型(無論出于什么原因),我仍然建議使用類型提示和返回類型作為最低限度來提高PHP代碼質量。 自從了解它以來,我習慣在我創建的每個新PHP文件中使用它。事實上,我更新了PhpStorm設置中的所有模板,以便它自動包含在我創建的每個文件的頂部。例如,下面是創建一個新的PHP類時使用的模板: ``` <?php declare(strict_types=1); #parse("PHP File Header.php") #if (${NAMESPACE}) namespace ${NAMESPACE}; #end class ${NAME} { } ``` 這真的很方便,因為它鼓勵我繼續使用`declare(strict_types=1)`,而不需要在創建文件后進行任何手動更改(我肯定會忘記這樣做!)。 對于我的任何Laravel閱讀器,您還可以在運行Artisan命令(如`php artisan make:controller`)時發布用于創建PHP文件的存根。通過發布存根,您可以編輯它們并將`declare(strict_types=1)`添加到頂部。這意味著您使用Artisan命令創建的文件將在已啟用更嚴格類型安全的情況下創建。 當然,如果您打算對現有文件添加更嚴格的類型檢查,我強烈建議您首先要有一個高質量的測試套件。您的PHP代碼可能允許傳遞不正確的數據類型而不引發任何錯誤。但是,通過啟用嚴格的類型檢查,您的代碼將變得不那么寬容,并可能開始拋出錯誤。這可能會導致應用程序以用戶意想不到的方式中斷。 您可能還會發現需要重構一些代碼,使其與`declare(strict_types=1)`兼容。但我不認為這是件壞事。相反,我認為這是一個提高代碼質量的機會。 為了幫助您將`declare(strict_types=1)`添加到代碼中,您可能需要使用PHPStan之類的工具,它可以為您收集這些類型不匹配。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看