日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

使用Declare(strict_Types=1)來獲得更健壯的PHP代碼

來源: 責(zé)編: 時間:2024-07-12 17:25:31 681觀看
導(dǎo)讀介紹如果您是PHP開發(fā)人員,您可能在某些PHP文件的開頭看到過declare(strict_types=1)語句。我第一次看到這個聲明時,我不知道它是做什么的。我以為這是某種注釋,或者是我之前的舊PHP語法,但我錯了(大錯特錯?。?。在這篇文章中,我

介紹

如果您是PHP開發(fā)人員,您可能在某些PHP文件的開頭看到過declare(strict_types=1)語句。11G28資訊網(wǎng)——每日最新資訊28at.com

我第一次看到這個聲明時,我不知道它是做什么的。我以為這是某種注釋,或者是我之前的舊PHP語法,但我錯了(大錯特錯!)。11G28資訊網(wǎng)——每日最新資訊28at.com

在這篇文章中,我們將介紹什么是declare(strict_types=1),以及它如何幫助您提高PHP代碼的類型安全性。11G28資訊網(wǎng)——每日最新資訊28at.com

declare(strict_types=1) 是什么?

declare(strict_types=1)是一個啟用PHP嚴格模式并在PHP應(yīng)用程序中強制嚴格類型的語句。11G28資訊網(wǎng)——每日最新資訊28at.com

它是在PHP 7.0中添加的,當時類型聲明系統(tǒng)首次在PHP中實現(xiàn)。這意味著它可以在PHP 8項目中使用,因此您可以開始在代碼中充分利用嚴格類型。11G28資訊網(wǎng)——每日最新資訊28at.com

當你使用這個語句時,PHP會對函數(shù)的參數(shù)和返回類型進行嚴格的類型檢查。這意味著如果一個函數(shù)需要某種類型的參數(shù)或返回值,如果使用了錯誤的類型,PHP將拋出錯誤。這也適用于具有指定類型提示和返回類型的PHP閉包和箭頭函數(shù)。11G28資訊網(wǎng)——每日最新資訊28at.com

讓我們舉一個不使用declare(strict_types=1)的簡單例子:11G28資訊網(wǎng)——每日最新資訊28at.com

function add(int $a, int $b): int{    return $a + $b;}

現(xiàn)在假設(shè)我們用字符串參數(shù)調(diào)用這個函數(shù):11G28資訊網(wǎng)——每日最新資訊28at.com

echo add('1', '2'); // Output:// 3

PHP會很高興地將字符串參數(shù)轉(zhuǎn)換為整數(shù)并返回結(jié)果3。11G28資訊網(wǎng)——每日最新資訊28at.com

在某些情況下,您可能完全不介意這種行為。但它可能會產(chǎn)生一些您沒有預(yù)料到的意外后果,并可能導(dǎo)致應(yīng)用程序中的錯誤。11G28資訊網(wǎng)——每日最新資訊28at.com

然而,讓我們假設(shè)我們想在這個例子中使用declare(strict_types=1)。我們可以通過在文件頂部添加以下語句來實現(xiàn)這一點:11G28資訊網(wǎng)——每日最新資訊28at.com

declare(strict_types=1); function add(int $a, int $b): int{    return $a + $b;}

現(xiàn)在,如果我們用字符串參數(shù)調(diào)用add函數(shù),PHP將拋出一個錯誤:11G28資訊網(wǎng)——每日最新資訊28at.com

echo add('1', '2'); // Output:// Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given

正如我們在這里看到的,PHP拋出了一個錯誤,因為add函數(shù)期望傳遞整數(shù),但卻接收到了字符串。11G28資訊網(wǎng)——每日最新資訊28at.com

類似地,如果啟用了嚴格的類型檢查,并且我們試圖從方法返回錯誤的數(shù)據(jù)類型,PHP也會拋出錯誤。例如,假設(shè)我們的add函數(shù)現(xiàn)在接受浮點數(shù)而不是整數(shù),并且我們沒有啟用嚴格的類型檢查:11G28資訊網(wǎng)——每日最新資訊28at.com

function add(float $a, float $b): int{    return $a + $b;}

我們可以這樣調(diào)用函數(shù):11G28資訊網(wǎng)——每日最新資訊28at.com

echo add(1.25, 2.25); // Output:// 3

你發(fā)現(xiàn)輸出中的問題了嗎?11G28資訊網(wǎng)——每日最新資訊28at.com

我們應(yīng)該得到的答案是3.5。然而,因為我們已經(jīng)將返回類型定義為int,所以我們已經(jīng)將浮點數(shù)(應(yīng)該返回的)轉(zhuǎn)換為整數(shù),并失去了精度。可以想象,這可能會在我們應(yīng)用程序的其他部分導(dǎo)致一些問題,我們正在使用這個結(jié)果,并且可能需要精度。11G28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在讓我們通過使用declare(strict_types=1)來解決這個問題:11G28資訊網(wǎng)——每日最新資訊28at.com

declare(strict_types=1); function add(float $a, float $b): int{    return $a + $b;}

我們可以這樣調(diào)用函數(shù):11G28資訊網(wǎng)——每日最新資訊28at.com

echo add(1.25, 2.25); // Output:// Fatal error: Uncaught TypeError: add(): Return value must be of type int, float returned

正如我們所看到的,通過啟用嚴格的類型檢查,我們可以發(fā)現(xiàn)函數(shù)沒有返回與返回類型聲明匹配的正確數(shù)據(jù)類型。這很好,因為它可以突出顯示我們代碼中可能存在的錯誤,而我們并不知道。然后,我們可以采取必要的步驟:11G28資訊網(wǎng)——每日最新資訊28at.com

  • 如果返回類型不正確,請更新它們
  • 如果類型提示不正確,請更新類型提示
  • 如果數(shù)據(jù)類型不正確,則更新函數(shù)體以返回正確的數(shù)據(jù)類型
  • 修復(fù)調(diào)用函數(shù)的代碼中可能向其傳遞錯誤數(shù)據(jù)類型的任何錯誤

我應(yīng)該使用declare(strict_types=1)嗎?

我個人認為,在所有的PHP文件中使用declare(strict_types=1)是一個好主意。我曾經(jīng)認為僅僅有類型提示和返回類型就足以確保傳遞正確的數(shù)據(jù)類型,但我現(xiàn)在改變了主意。當我使用declare(strict_types=1)時,我對我的代碼更有信心,并且由于使用它而發(fā)現(xiàn)了一些bug(特別是當將它添加到舊代碼庫時)。11G28資訊網(wǎng)——每日最新資訊28at.com

由于PHP是一種動態(tài)類型的語言(而不是嚴格類型的語言),這意味著如果你不想的話,你根本不需要指定任何返回類型或類型提示。相反,PHP將在運行時為您確定類型。然而,即使有可能這樣做,我還是強烈建議不要這樣做。如果你不能在代碼中使用嚴格類型(無論出于什么原因),我仍然建議使用類型提示和返回類型作為最低限度來提高PHP代碼質(zhì)量。11G28資訊網(wǎng)——每日最新資訊28at.com

自從了解它以來,我習(xí)慣在我創(chuàng)建的每個新PHP文件中使用它。事實上,我更新了PhpStorm設(shè)置中的所有模板,以便它自動包含在我創(chuàng)建的每個文件的頂部。例如,下面是創(chuàng)建一個新的PHP類時使用的模板:11G28資訊網(wǎng)——每日最新資訊28at.com

<?phpdeclare(strict_types=1);#parse("PHP File Header.php")#if (${NAMESPACE})namespace ${NAMESPACE};#endclass ${NAME} {}

這真的很方便,因為它鼓勵我繼續(xù)使用declare(strict_types=1),而不需要在創(chuàng)建文件后進行任何手動更改(我肯定會忘記這樣做?。?。11G28資訊網(wǎng)——每日最新資訊28at.com

對于我的任何Laravel閱讀器,您還可以在運行Artisan命令(如php artisan make:controller)時發(fā)布用于創(chuàng)建PHP文件的存根。通過發(fā)布存根,您可以編輯它們并將declare(strict_types=1)添加到頂部。這意味著您使用Artisan命令創(chuàng)建的文件將在已啟用更嚴格類型安全的情況下創(chuàng)建。11G28資訊網(wǎng)——每日最新資訊28at.com

當然,如果您打算對現(xiàn)有文件添加更嚴格的類型檢查,我強烈建議您首先要有一個高質(zhì)量的測試套件。您的PHP代碼可能允許傳遞不正確的數(shù)據(jù)類型而不引發(fā)任何錯誤。但是,通過啟用嚴格的類型檢查,您的代碼將變得不那么寬容,并可能開始拋出錯誤。這可能會導(dǎo)致應(yīng)用程序以用戶意想不到的方式中斷。11G28資訊網(wǎng)——每日最新資訊28at.com

您可能還會發(fā)現(xiàn)需要重構(gòu)一些代碼,使其與declare(strict_types=1)兼容。但我不認為這是件壞事。相反,我認為這是一個提高代碼質(zhì)量的機會。11G28資訊網(wǎng)——每日最新資訊28at.com

為了幫助您將declare(strict_types=1)添加到代碼中,您可能需要使用PHPStan之類的工具,它可以為您收集這些類型不匹配。11G28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100729-0.html使用Declare(strict_Types=1)來獲得更健壯的PHP代碼

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 再談負載均衡,你學(xué)會了什么?

下一篇: 八款華麗的 HTML5 圖表應(yīng)用,你學(xué)會幾款?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 历史| 清苑县| 曲沃县| 宜章县| 宁蒗| 德令哈市| 钟祥市| 蓬莱市| 财经| 临颍县| 会东县| 许昌县| 安康市| 巴林右旗| 金川县| 吴桥县| 大丰市| 齐河县| 靖安县| 孝昌县| 威远县| 华阴市| 垫江县| 普定县| 西峡县| 梁山县| 东辽县| 阿克苏市| 襄城县| 津南区| 绵阳市| 荥阳市| 奈曼旗| 称多县| 绥滨县| 伊通| 霍邱县| 富顺县| 策勒县| 牡丹江市| 兴文县|