通過(guò)PHP類(lèi)常數(shù)和枚舉實(shí)現(xiàn)類(lèi)型安全
Jul 30, 2025 am 01:23 AMPHP 8.1枚舉通過(guò)啟用本地類(lèi)型的提示和編譯時(shí)間驗(yàn)證,為類(lèi)常數(shù)提供了真正的類(lèi)型安全。 1。類(lèi)常數(shù)缺乏類(lèi)型執(zhí)行,可以通過(guò)無(wú)效的字符串。 2。純淨(jìng)和背面的枚舉(例如,枚舉Orderstatus:字符串)確保僅接受有效的情況,以防止類(lèi)型錯(cuò)誤。 3。使用後排枚舉進(jìn)行數(shù)據(jù)庫(kù)/API映射,狀態(tài)標(biāo)誌的純枚舉。 4.應(yīng)用最佳實(shí)踐:嚴(yán)格鍵入,詳盡處理的匹配表達(dá)式以及用於安全輸入驗(yàn)證的TryFrom()。 5。增強(qiáng)具有屬性的枚舉,以將元數(shù)據(jù)像標(biāo)籤一樣。從常數(shù)遷移到枚舉可以提高代碼安全性,可讀性和IDE支持,使其非常適合固定價(jià)值集(例如狀態(tài)或角色)。
近年來(lái),PHP已經(jīng)顯著發(fā)展,並且隨著諸如類(lèi)常數(shù),後備和純粹枚舉(從PHP 8.1)等功能引入功能,開(kāi)發(fā)人員現(xiàn)在擁有強(qiáng)大的工具來(lái)強(qiáng)制執(zhí)行類(lèi)型的安全性,尤其是在處理固定值集時(shí)。這對(duì)於減少錯(cuò)誤,提高代碼可讀性以及實(shí)現(xiàn)更好的IDE支持和靜態(tài)分析至關(guān)重要。

這是您可以有效地利用班級(jí)常數(shù)和枚舉來(lái)實(shí)現(xiàn)現(xiàn)代PHP應(yīng)用中的類(lèi)型安全性的方法。
1。使用類(lèi)常數(shù)進(jìn)行類(lèi)型安全性(PHP PRED 8.1方法)
在引入枚舉之前,一個(gè)常見(jiàn)的模式是定義類(lèi)中的相關(guān)常數(shù),並將其與類(lèi)型提示或驗(yàn)證配對(duì)。

階級(jí)Orderstatus { 公共const等待='待定'; 公共銷(xiāo)售='運(yùn)送'; 公共const交付=“交付”; 公共const取消='取消'; }
然後,您可以在您的應(yīng)用程序上使用這些常數(shù):
函數(shù)updateStatus(字符串$狀態(tài)):void { if(!in_array($ status,[[ Orderstatus ::等待, Orderstatus ::運(yùn)送, Orderstatus ::交付, Orderstatus ::取消, ], 真的)) { 拋出新的無(wú)效Exception('無(wú)效狀態(tài)'); } //繼續(xù)更新 }
限制:

- 沒(méi)有本機(jī)類(lèi)型約束:
$status
仍然只是一個(gè)string
。 - 沒(méi)有編譯時(shí)驗(yàn)證。
- 易於通過(guò)不屬於允許集的任意字符串。
這種方法提高了一致性,但不能在語(yǔ)言層面提供實(shí)際類(lèi)型的安全性。
2。枚舉8.1中的枚舉:真正的類(lèi)型安全
使用PHP 8.1,引入了枚舉,使您可以定義具有實(shí)際類(lèi)型的固定值。
基本(純)枚舉
枚舉Orderstatus:字符串 { 案例待定='待定'; 案件發(fā)貨='已發(fā)貨'; 案件交付='交付'; 案例取消='取消'; }
現(xiàn)在,您可以使用枚舉直接鍵入含義:
功能UpdateStatus(Orderstatus $狀態(tài)):void { // $狀態(tài)保證是定義的案例之一 迴聲“更新到:”。 $ status-> value; }
用法:
UpdateStatus(Orderstatus ::運(yùn)送); //正確 updateStatus('運(yùn)送'); //?typeError:預(yù)期的Orderstatus,獲得了字符串
這是真正的類(lèi)型安全:只能通過(guò)有效的枚舉案例。
標(biāo)量映射的後備枚舉
上面的OrderStatus
是一個(gè)後備枚舉(它具有: string
襯裡類(lèi)型),這意味著每個(gè)情況都映射到標(biāo)量值。您還可以創(chuàng)建無(wú)背景值的純枚舉(對(duì)於狀態(tài)標(biāo)誌很有用):
枚舉優(yōu)先級(jí) { 案例低; 案例培養(yǎng)基; 案例高; }
即使沒(méi)有標(biāo)量值,您仍然可以在通過(guò)Priority::HIGH
,等等。
3。帶枚舉的類(lèi)型安全代碼的最佳實(shí)踐
完全受益於枚舉並避免常見(jiàn)的陷阱:
- ?在表示固定的選項(xiàng)集時(shí),請(qǐng)始終在字符串/int常數(shù)上使用枚舉。
- ?當(dāng)您需要持久價(jià)值時(shí)(例如,在數(shù)據(jù)庫(kù)或API中) ,更喜歡後備枚舉。
- ?使用嚴(yán)格的鍵入(
declare(strict_types=1);
)確保執(zhí)行類(lèi)型檢查。 - ?利用匹配表達(dá)式進(jìn)行安全,詳盡的處理:
功能getStatuslabel(orderstatus $ status):字符串 { 返回匹配($ status){ Orderstatus :: perfend =>'等待發(fā)貨', orderstatus :: spiend =>'在路上', orderstatus :: varvifeed =>'交付', orderstatus :: casuted =>'取消訂單', }; }
- ?從外部來(lái)源進(jìn)行補(bǔ)水時(shí)早期驗(yàn)證輸入:
$ status = orderstatus :: tryfrom($ _ post ['status']) ?拋出新的無(wú)效Exception('無(wú)效狀態(tài)');
4。將枚舉與元數(shù)據(jù)的屬性(PHP 8)相結(jié)合
您可以增強(qiáng)具有附加元數(shù)據(jù)屬性的枚舉(例如,標(biāo)籤,顏色,權(quán)限):
#[屬性] 班級(jí)標(biāo)籤 { 公共功能__construct(public String $ text){} } 枚舉優(yōu)先級(jí) { #[label('低優(yōu)先級(jí)')] 案例低; #[label('中等優(yōu)先級(jí)')] 案例培養(yǎng)基; #[label('高優(yōu)先級(jí)')] 案例高; 公共功能標(biāo)籤():字符串 { $ Reflector = new \ reflecleteNumcase(self :: class,$ this-> name); $ attribute = $ Reflector-> getAttributes(label :: class)[0] ??無(wú)效的; 返回$屬性? - > newinstance() - >文本?? $ this-> name; } }
現(xiàn)在Priority::HIGH->label()
返回'High Priority'
。
最後的想法
儘管班級(jí)常數(shù)有助於組織價(jià)值,但他們?nèi)狈?shí)際的執(zhí)法。 PHP 8.1中的枚舉縮小了差距,提供:
- 編譯時(shí)間(或運(yùn)行時(shí))類(lèi)型安全
- 詳盡的案例處理通過(guò)
match
- 與數(shù)據(jù)庫(kù)和API的互操作性
->value
- IDE自動(dòng)完成和重構(gòu)支持
對(duì)於新項(xiàng)目,每當(dāng)您對(duì)一組有限的選項(xiàng)建模時(shí),都要支持枚舉。結(jié)果是更清潔,更安全,更可維護(hù)的代碼。
基本上,如果您仍在使用字符串常數(shù)作為狀態(tài),角色或類(lèi)型,請(qǐng)考慮升級(jí)到枚舉。這不僅是語(yǔ)法改進(jìn);這是邁向健壯,自我紀(jì)念的PHP的真正一步。
以上是通過(guò)PHP類(lèi)常數(shù)和枚舉實(shí)現(xiàn)類(lèi)型安全的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

PhpeValuatesConstantExpressatAtcompiletimetoetimetoemetotocreveranceandearlyerrordetection.1.ConstantExpressepressevaluationMeanScomputingValuesDuruesduresduresduring-CompiLation -whenalloperandSareSareSareConconstantSareConconstantsLikeLiterals,classConstants,classConstants,classConstants,orpredefendinedconcontantstants.2.phpp'2.php’2.php’2.2.php’2.php’2.php’2.php’2.php’2.php’sse

PHPdoesnotallowconstantredeclarationbetweentraitsandclasses,resultinginafatalerrorwhenduplicateconstantnamesoccuracrosstraits,parentclasses,orchildclasses;1)constantsintraitsarecopieddirectlyintotheusingclassatcompiletime;2)ifaclassdefinesaconstantwi

?Yes,constantsarefasterthanvariablesincompiledlanguagesduetocompile-timeevaluationandinlining.1.Constantsareevaluatedatcompiletime,enablingvalueinlining,constantfolding,andeliminationofmemoryallocation,whilevariablesrequireruntimeresolutionandmemorya

constantssshouldbovedtoenforceimmutabilityInphpforBetterCodeClarityAndSafety; 1)useconstantsforconfigurationanddomainlogiclikiclikestatuscodesorappointpointpointpointstoavoidmagicvalues; 2)

Namespacingpreventsconstantcollisionsinlarge-scalesoftwareprojectsbygroupingrelatedconstantswithinuniquescopes.1)Constants,whichshouldremainunchangedduringruntime,cancausenamingconflictswhendefinedglobally,asdifferentmodulesorlibrariesmayusethesamena

優(yōu)先使用const,因?yàn)樗诰幾g時(shí)解析,性能更好且支持命名空間;2.當(dāng)需要在條件、函數(shù)中定義常量或使用動(dòng)態(tài)名稱(chēng)時(shí),必須使用define();3.類(lèi)中只能使用const定義常量;4.define()可在運(yùn)行時(shí)動(dòng)態(tài)定義並支持表達(dá)式和完整命名空間字符串;5.兩者一旦定義均不可修改,但define()可通過(guò)defined()避免重複定義,而const不能檢查;6.const名稱(chēng)必須為字面量,不支持變量插值。因此,const適用於固定、明確的常量,define()適用於需要運(yùn)行時(shí)邏輯或動(dòng)態(tài)命名的場(chǎng)景,選擇

PHP的7個(gè)魔術(shù)常量是__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__TRAIT__、__METHOD__,它們能動(dòng)態(tài)返回代碼位置和上下文信息,1.LINE返回當(dāng)前行號(hào),用於精準(zhǔn)調(diào)試;2.FILE返回當(dāng)前文件的絕對(duì)路徑,常用於可靠地引入文件或定義根目錄;3.DIR返回當(dāng)前文件所在目錄,比dirname(__FILE__)更清晰高效;4.FUNCTION返回當(dāng)前函數(shù)名,適用於函數(shù)級(jí)日誌跟蹤;5.CLASS返回當(dāng)前類(lèi)名(含命名空間),在日誌和工廠

Php8.1 EnumsSprovidEteTyEtePesafetyOverClassConstantsByEnablingNativeTypeHintsAndCompile timeValidation.1.ClassConstantSlackTyPeenForecement,允許InvalidStringStoBepAssed.2.pureandbackedenums(E.G.,EnumorderStatus:string crarevare)
