偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 前端
對(duì)于我的任何Laravel閱讀器,您還可以在運(yùn)行Artisan命令(如php artisan make:controller)時(shí)發(fā)布用于創(chuàng)建PHP文件的存根。通過(guò)發(fā)布存根,您可以編輯它們并將declare(strict_types=1)添加到頂部。這意味著您使用Artisan命令創(chuàng)建的文件將在已啟用更嚴(yán)格類型安全的情況下創(chuàng)建。

介紹

如果您是PHP開(kāi)發(fā)人員,您可能在某些PHP文件的開(kāi)頭看到過(guò)declare(strict_types=1)語(yǔ)句。

我第一次看到這個(gè)聲明時(shí),我不知道它是做什么的。我以為這是某種注釋,或者是我之前的舊PHP語(yǔ)法,但我錯(cuò)了(大錯(cuò)特錯(cuò)?。?。

在這篇文章中,我們將介紹什么是declare(strict_types=1),以及它如何幫助您提高PHP代碼的類型安全性。

declare(strict_types=1) 是什么?

declare(strict_types=1)是一個(gè)啟用PHP嚴(yán)格模式并在PHP應(yīng)用程序中強(qiáng)制嚴(yán)格類型的語(yǔ)句。

它是在PHP 7.0中添加的,當(dāng)時(shí)類型聲明系統(tǒng)首次在PHP中實(shí)現(xiàn)。這意味著它可以在PHP 8項(xiàng)目中使用,因此您可以開(kāi)始在代碼中充分利用嚴(yán)格類型。

當(dāng)你使用這個(gè)語(yǔ)句時(shí),PHP會(huì)對(duì)函數(shù)的參數(shù)和返回類型進(jìn)行嚴(yán)格的類型檢查。這意味著如果一個(gè)函數(shù)需要某種類型的參數(shù)或返回值,如果使用了錯(cuò)誤的類型,PHP將拋出錯(cuò)誤。這也適用于具有指定類型提示和返回類型的PHP閉包和箭頭函數(shù)。

讓我們舉一個(gè)不使用declare(strict_types=1)的簡(jiǎn)單例子:

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

現(xiàn)在假設(shè)我們用字符串參數(shù)調(diào)用這個(gè)函數(shù):

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

PHP會(huì)很高興地將字符串參數(shù)轉(zhuǎn)換為整數(shù)并返回結(jié)果3。

在某些情況下,您可能完全不介意這種行為。但它可能會(huì)產(chǎn)生一些您沒(méi)有預(yù)料到的意外后果,并可能導(dǎo)致應(yīng)用程序中的錯(cuò)誤。

然而,讓我們假設(shè)我們想在這個(gè)例子中使用declare(strict_types=1)。我們可以通過(guò)在文件頂部添加以下語(yǔ)句來(lái)實(shí)現(xiàn)這一點(diǎn):

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

現(xiàn)在,如果我們用字符串參數(shù)調(diào)用add函數(shù),PHP將拋出一個(gè)錯(cuò)誤:

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

正如我們?cè)谶@里看到的,PHP拋出了一個(gè)錯(cuò)誤,因?yàn)閍dd函數(shù)期望傳遞整數(shù),但卻接收到了字符串。

類似地,如果啟用了嚴(yán)格的類型檢查,并且我們?cè)噲D從方法返回錯(cuò)誤的數(shù)據(jù)類型,PHP也會(huì)拋出錯(cuò)誤。例如,假設(shè)我們的add函數(shù)現(xiàn)在接受浮點(diǎn)數(shù)而不是整數(shù),并且我們沒(méi)有啟用嚴(yán)格的類型檢查:

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

我們可以這樣調(diào)用函數(shù):

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

你發(fā)現(xiàn)輸出中的問(wèn)題了嗎?

我們應(yīng)該得到的答案是3.5。然而,因?yàn)槲覀円呀?jīng)將返回類型定義為int,所以我們已經(jīng)將浮點(diǎn)數(shù)(應(yīng)該返回的)轉(zhuǎn)換為整數(shù),并失去了精度。可以想象,這可能會(huì)在我們應(yīng)用程序的其他部分導(dǎo)致一些問(wèn)題,我們正在使用這個(gè)結(jié)果,并且可能需要精度。

現(xiàn)在讓我們通過(guò)使用declare(strict_types=1)來(lái)解決這個(gè)問(wèn)題:

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

我們可以這樣調(diào)用函數(shù):

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

正如我們所看到的,通過(guò)啟用嚴(yán)格的類型檢查,我們可以發(fā)現(xiàn)函數(shù)沒(méi)有返回與返回類型聲明匹配的正確數(shù)據(jù)類型。這很好,因?yàn)樗梢酝怀鲲@示我們代碼中可能存在的錯(cuò)誤,而我們并不知道。然后,我們可以采取必要的步驟:

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

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

我個(gè)人認(rèn)為,在所有的PHP文件中使用declare(strict_types=1)是一個(gè)好主意。我曾經(jīng)認(rèn)為僅僅有類型提示和返回類型就足以確保傳遞正確的數(shù)據(jù)類型,但我現(xiàn)在改變了主意。當(dāng)我使用declare(strict_types=1)時(shí),我對(duì)我的代碼更有信心,并且由于使用它而發(fā)現(xiàn)了一些bug(特別是當(dāng)將它添加到舊代碼庫(kù)時(shí))。

由于PHP是一種動(dòng)態(tài)類型的語(yǔ)言(而不是嚴(yán)格類型的語(yǔ)言),這意味著如果你不想的話,你根本不需要指定任何返回類型或類型提示。相反,PHP將在運(yùn)行時(shí)為您確定類型。然而,即使有可能這樣做,我還是強(qiáng)烈建議不要這樣做。如果你不能在代碼中使用嚴(yán)格類型(無(wú)論出于什么原因),我仍然建議使用類型提示和返回類型作為最低限度來(lái)提高PHP代碼質(zhì)量。

自從了解它以來(lái),我習(xí)慣在我創(chuàng)建的每個(gè)新PHP文件中使用它。事實(shí)上,我更新了PhpStorm設(shè)置中的所有模板,以便它自動(dòng)包含在我創(chuàng)建的每個(gè)文件的頂部。例如,下面是創(chuàng)建一個(gè)新的PHP類時(shí)使用的模板:

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

這真的很方便,因?yàn)樗膭?lì)我繼續(xù)使用declare(strict_types=1),而不需要在創(chuàng)建文件后進(jìn)行任何手動(dòng)更改(我肯定會(huì)忘記這樣做?。?/p>

對(duì)于我的任何Laravel閱讀器,您還可以在運(yùn)行Artisan命令(如php artisan make:controller)時(shí)發(fā)布用于創(chuàng)建PHP文件的存根。通過(guò)發(fā)布存根,您可以編輯它們并將declare(strict_types=1)添加到頂部。這意味著您使用Artisan命令創(chuàng)建的文件將在已啟用更嚴(yán)格類型安全的情況下創(chuàng)建。

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

您可能還會(huì)發(fā)現(xiàn)需要重構(gòu)一些代碼,使其與declare(strict_types=1)兼容。但我不認(rèn)為這是件壞事。相反,我認(rèn)為這是一個(gè)提高代碼質(zhì)量的機(jī)會(huì)。

為了幫助您將declare(strict_types=1)添加到代碼中,您可能需要使用PHPStan之類的工具,它可以為您收集這些類型不匹配。

責(zé)任編輯:武曉燕 來(lái)源: 開(kāi)源技術(shù)小棧
相關(guān)推薦

2016-01-28 13:33:07

2020-07-15 08:17:16

代碼

2018-05-14 17:16:57

BSI云計(jì)算標(biāo)準(zhǔn)

2025-03-11 08:30:00

Pythonretrying代碼

2023-12-13 13:00:57

2024-09-30 14:38:47

2019-01-29 09:00:44

PyHamcrest單元測(cè)試框架

2016-10-12 13:37:09

LombokIDEidea

2014-11-05 20:05:46

dockerJenkins

2025-06-11 03:22:00

JavaScript開(kāi)發(fā)前端

2010-03-11 10:33:49

2010-04-29 12:13:53

Oracle使用alt

2010-06-10 10:20:29

openSUSE使用教

2021-09-15 07:56:33

函數(shù)類型Go

2021-01-15 05:16:37

Vue3開(kāi)源代碼量

2023-10-10 14:57:49

2023-11-17 11:55:54

Pythonretrying庫(kù)

2020-10-30 12:42:06

TypeScript編程開(kāi)發(fā)

2024-05-11 18:48:40

技巧代碼技能

2025-06-09 01:30:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)