PHP 8.1 enumsは、ネイティブタイプのヒントとコンパイルタイム検証を可能にすることにより、クラス定數(shù)を介した真のタイプの安全性を提供します。 1。クラス定數(shù)はタイプの施行を欠いており、無効な文字列を渡すことができます。 2。純粋および裏返しの列挙(例:enum orderstatus:string)は、有効なケースのみが受け入れられ、タイプのエラーを防ぎます。 3.データベース/APIマッピングには、狀態(tài)フラグの純粋な酵素にバックされた酵素を使用します。 4.ベストプラクティスを適用します:厳密なタイピング、徹底的な取り扱いのための式と一致し、安全な入力検証のために()tryfrom()を試します。 5.屬性を持つ列挙を強(qiáng)化して、ラベルのようなメタデータを添付します。定數(shù)から酵素に移行すると、コードの安全性、読みやすさ、IDEサポートが向上し、ステータスや役割などの固定値セットに最適です。
PHPは近年大幅に進(jìn)化しており、クラス定數(shù)、バックされた純粋な列挙や純粋な列挙などの機(jī)能の導(dǎo)入により(PHP 8.1の時點)、開発者は、特に固定値のセットを扱うときにタイプの安全性を強(qiáng)制するための強(qiáng)力なツールを持っています。これは、バグを減らし、コードの読みやすさを改善し、より良いIDEサポートと靜的分析を可能にするために重要です。

クラスの定數(shù)と列挙を効果的に活用して、最新のPHPアプリケーションでタイプの安全性を?qū)g現(xiàn)する方法は次のとおりです。
1.タイプ安全にクラス定數(shù)を使用する(PHP 8.1アプローチ)
酵素が導(dǎo)入される前に、一般的なパターンは、クラス內(nèi)の関連定數(shù)を定義し、それらをタイプのヒントまたは検証と組み合わせることでした。

クラスorderstatus { public const pending = 'pending'; public const出荷= '出荷'; public const derivided = '配信'; public const canceled = 'canceled'; }
次に、アプリケーション全體でこれらの定數(shù)を使用できます。
function updatestatus(String $ status):void { if(!in_array($ status、[) orderstatus ::保留中、 orderstatus ::出荷、 orderstatus ::配信、 orderstatus ::キャンセル、 ]、 真実)) { 新しいInvalidargumentException( 'invalid status')を投げます。 } //更新を進(jìn)めます }
制限:

- ネイティブタイプの制約はありません:
$status
はまだstring
です。 - コンパイル時間の検証はありません。
- 許可セットの一部ではない任意の文字列を簡単に通過できます。
このアプローチは一貫性を改善しますが、言語レベルで実際のタイプの安全性を提供しません。
2。PHP 8.1の酵素:真のタイプの安全性
PHP 8.1を使用すると、列挙が導(dǎo)入され、実際のタイプの名前付き値の固定セットを定義できます。
基本(純粋な)列挙
enum orderstatus:文字列 { CASE PENDING = 'PENDING'; ケース出荷= '出荷'; ケース配信= '配信'; case canceled = 'キャンセル'; }
これで、列挙を使用して直接ヒントを入力できます。
関數(shù)updateStatus(orderstatus $ status):void { // $ステータスは、定義されたケースの1つであることが保証されています エコー「更新:」。 $ status-> value; }
使用法:
updatestatus(orderstatus :: sippided); //?正しい updateStatus( '出荷'); //?タイプエラー:予想されるorderstatus、stringを取得しました
これは真のタイプの安全性です:有効な列挙ケースのみに合格できます。
スカラーマッピング用のバックされた酵素
上記のOrderStatus
、バックされた列挙型( : string
バッキングタイプがあります)であり、各ケースはスカラー値にマップします。また、バッキング値(狀態(tài)のようなフラグに役立つ)なしで純粋なエナムを作成することもできます。
列挙の優(yōu)先度 { ケースロー; ケースメディア; ケースハイ; }
スカラー値がなくても、 Priority::HIGH
3。酵素を使用したタイプセーフコードのベストプラクティス
列挙から完全に恩恵を受け、一般的な落とし穴を避けるために:
- sidic一連のオプションを表すときは、常に文字列/int定數(shù)を介して列挙を使用してください。
- could値を持続する必要がある場合(たとえば、データベースまたはAPIで)、バックされた列挙を好みます。
- startictタイピング(
declare(strict_types=1);
)を使用して、タイプチェックが強(qiáng)制されていることを確認(rèn)します。 - safe安全で網(wǎng)羅的な取り扱いのための一致式をレバレッジします:
関數(shù)getStatusLabel(orderstatus $ status):文字列 { return match($ status){ orderstatus :: pending => '待ち出荷'、 orderstatus ::出荷=> '途中'、 orderstatus ::配信=> '配信'、 orderstatus :: canceled => '注文キャンセル'、 }; }
- surcions外部ソースから潤いを與えるときに入力を早期に検証します:
$ status = orderstatus :: tryfrom($ _ post ['status']) ??新しいInvalidargumentException( 'invalid status')を投げます。
4。メタデータの屬性(PHP 8)と酵素を組み合わせる
メタデータ(ラベル、色、許可など)を添付するための屬性を持つenmを強(qiáng)化できます。
#[屬性] クラスラベル { パブリック関數(shù)__construct(public string $ text){} } 列挙の優(yōu)先度 { #[label( 'low priority')] ケースロー; #[label( 'Medium Priority')] ケースメディア; #[label( 'High Priority')] ケースハイ; パブリック関數(shù)ラベル():文字列 { $ refector = new \ ReflectionEnumcase(self :: class、$ this-> name); $屬性= $ refector-> getattributes(label :: class)[0] ?? null; $屬性を返しますか? - > newInstance() - >テキスト?? $ this-> name; } }
Priority::HIGH->label()
は'High Priority'
を返します。
最終的な考え
クラスの定數(shù)は価値の整理に役立ちましたが、実際のタイプの執(zhí)行が欠けていました。 PHP 8.1の酵素は、そのギャップを閉じて、次のことを提供します。
- コンパイル時間(またはランタイム)タイプの安全性
-
match
による徹底的なケース処理 - データベースと
->value
介してAPIとの相互運(yùn)用性 - IDEオートコンプリートとリファクタリングサポート
新しいプロジェクトの場合、有限のオプションセットをモデル化するときはいつでも、クラス定數(shù)よりも敵を支持します。その結(jié)果、よりクリーンで安全で、より保守可能なコードが得られます。
基本的に、ステータス、役割、またはタイプに文字列定數(shù)をまだ使用している場合は、列挙のアップグレードを検討します。構(gòu)文の改善だけではありません。これは、堅牢で自己文書化されたPHPへの本當(dāng)のステップです。
以上がPHPクラスの定數(shù)と列挙でタイプの安全性を達(dá)成しますの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

phpevaluates constantexpressionsionsatimeTimetoepperpeperformandenableerrordetection.1.constantexpressionevaluationmeansComputingValuesduring during during during duringは、constantslikeliterals、class Conconstants、またはcledefinedconstants.2.phphphse

?、constantans arefasterthanvariablesincompiledlanguagesduetocopile-timeevaluationandinlining.1.constantantantantantantantantantantantantantantantantantantantantatantantatantatantatimeating、constingvalueinlining、constryfolding、andelimination ofmemoryallocation、whire-bariablesuntimeruntimeruntimeruntimeruntimeRuntimeRuntimememorya

phpdoesnotalowcontantredeclarationbetweentraitsandclasses、rucesinginginafatalerror rurror rurorror radescuracrosstraits、parentclasses、olchildclasses;

PHPの7つの魔法の定數(shù)は、__line__、__file__、__dir__、__function__、__class__、__trait__、__method__であり、コードの場所とコンテキスト情報を動的に返すことができます。 2。ファイルは、ファイルを確実に導(dǎo)入したり、ルートディレクトリを定義したりするためによく使用される現(xiàn)在のファイルの絶対パスを返します。 3。dir現(xiàn)在のファイルが配置されているディレクトリを返します。これは、dirName(__file__)よりも明確で効率的です。 4。関數(shù)は、関數(shù)レベルのログトラッキングに適した現(xiàn)在の関數(shù)名を返します。 5。クラスは、ログと工場で現(xiàn)在のクラス名(名前空間を含む)を返します

コンパイル時に解析し、パフォーマンスが向上し、名前空間をサポートするため、最初にconstを使用します。 2。條件と関數(shù)で定數(shù)を定義する必要がある場合、または動的名を使用する必要がある場合、define()を使用する必要があります。 3.クラス內(nèi)の定數(shù)を定義するためにconstのみを使用できます。 4。定義()は、実行時に式を動的に定義し、名前空間文字列を完全に定義できます。 5.両方が定義されると、変更できませんが、定義()はdefined()を介して繰り返し定義を回避できますが、constはチェックできません。 6. const名は文字通りでなければならず、可変補(bǔ)間をサポートしていません。したがって、constは固定および明示的な定數(shù)に適しており、定義はランタイムロジックまたは動的命名を必要とするシナリオに適しています。

ConstantsshouldbeusedtoenforceimmutabilityinPHPforbettercodeclarityandsafety;1)useconstantsforconfigurationanddomainlogiclikestatuscodesorAPIendpointstoavoidmagicvalues;2)preferclassorinterface-scopedconstantsoverglobalonestoimprovenamespacinganddisc

php8.1 enumsprovidetrueTypeTypeSafetyOverConconStantsByEnablingNativeTypeHintSandCompile-Timevalidation.1.ClassConstantStantsLackTotypeeNeductions、avainwinginvalidStringstobassed.2.pureandbackededeNums(E.G。)
