おそらく使用していない高度なPHPスイッチテクニック
ブール条件にスイッチ(true)を使用して、クリーンな条件付きルーターを作成します。 2。スイッチをin_array()と組み合わせて、グループ化されたアクションを効率的に処理します。 3.タイプジャグリングを避けるために、スイッチ内(true)内で===を使用して厳密なタイプチェックを強制します。 4。ループ内の2つの内部スイッチを続行して、外側ループの次の反復にスキップします。 5。関数の構造スイッチステートメントは、値を直接返すために、明確さを改善し、休憩を減らします。 6.行動を共有し、ロギングやエラー処理などの重複を減らすために休憩なしで意図的にグループ化します。これらの高度な技術を活用することにより、PHPのスイッチは、基本的な値のマッチングを超えて、強力で読みやすく、保守可能な制御構造になります。
おそらく、PHPのswitch
ステートメントを最も基本的な方法で使用している可能性があります。これは、いくつかのリテラル値に対して単一の変数を一致させます。しかし、PHPのswitch
、多くの開発者が実現するよりも柔軟性があり、いくつかの高度な技術を使用すると、よりクリーナー、より効率的で、より表現力のあるコードを書き込むことができます。以下は、基本を超えたスイッチのあまり知られていないが強力なswitch
の使用をいくつか紹介します。

1。ブール式のスイッチング(条件付きルーターとしての切り替え)
変数をオンにする代わりに、 switch (true)
を使用して複数のブール条件を評価できます。これにより、 switch
if-elseif
ステートメントのチェーンと同様に条件付きルーターになりますが、多くの場合、多くの条件がある場合はよりきれいで読みやすくなります。
switch(true){ ケース$ <年齢<13: エコー「子」; 壊す; ケース$ <年齢18: エコー「ティーン」; 壊す; ケース$ age> = 65: エコー「シニア」; 壊す; デフォルト: エコー「アダルト」; 壊す; }
これは、条件が複雑であるか、複数の変数が含まれている場合に特に役立ちます。ロジックをグループ化し、深い巣を避けます。

場合によってはif-elseよりも優れている理由:
- すべてのケースが調整されているため、スキャンが容易になります。
- インデントを減らし、視覚的な流れを改善します。
-
continue
)(ループ内)を使用して意図的に転倒したり、必要に応じてbreak
を省略したりすることができます。
2。配列とin_array()ロジックを使用してスイッチを使用します
switch
を使用して、セット(配列)に対して値を一致させることができます。これをtrue
およびin_array()
チェックと組み合わせることができます。これは、複数の入力を同じ動作にグループ化する場合に役立ちます。

$ action = 'save'; switch(true){ case in_array($ action、['save'、 'store'、 'create']): savedata(); 壊す; case in_array($ action、['delete'、 'remove']): deletedata(); 壊す; case in_array($ action、['edit'、 'update']): editdata(); 壊す; デフォルト: エコー「不明なアクション」; }
このパターンは、複数の||
よりもきれいです多くのグループ化されたアクションがある場合、ステートメントとスケールが改善されるかif
を確認します。
3。akesステートメントのタイプセーフマッチングと===
デフォルトでは、 switch
ゆるい比較( ==
)を使用します。これは、タイプジャグリングによる予期しない一致につながる可能性があります。ただし、ロジックを慎重にキャストまたは構造化することにより、厳格な比較を実施できます。
PHPでは、 switch
で比較演算子を直接変更することはできませんが、厳密なマッチングをシミュレートできます。
$ role = '0'; switch(true){ case $ role === 'admin': エコー「フルアクセス」; 壊す; case $ role === 'モデレーター': エコー「リミテッドアクセス」; 壊す; ケース$ role === '0': エコー「アクセスなし」; 壊す; デフォルト: エコー「無効な役割」; }
これにより'admin' == 0
タイプの強制のためにtrue
と評価する一般的な落とし穴が回避されます。 ===
でswitch (true)
を使用すると、タイプの安全性が保証されます。
4.続行2でループでスイッチを使用します
あまり知られていないトリックは、ループ内のswitch
内でcontinue 2
使用して、外側ループの次の反復にスキップすることです。これは、 switch
フィルタリングロジックの処理をしている場合に役立ちます。
foreach($ users as $ user){ switch(true){ ケース空($ user ['email']): case!filter_var($ user ['email']、filter_validate_email): 続行2; //次のユーザーにスキップします case $ user ['status'] === '非アクティブ': sendreminder($ user); 壊す; デフォルト: ProcessUser($ user); } }
ここでは、PHPにPHPに、ループ本体内での早期のリターンのように機能する親ループ( switch
だけでなく)を継続するように指示しcontinue 2
。
5。関数のリターンベースのスイッチ
echo
を使用したり、 switch
内で変数を設定する代わりに、それを使用して値を直接返します。これにより、機能がより予測可能で機能的になります。
関数getrolelevevel($ role){ return match($ role){ 'admin' => 9、 「モデレーター」=> 5、 「ユーザー」=> 1、 デフォルト=> 0、 }; }
待ってください - それはmatch
はなく、 switch
します。ただし、古いPHPバージョンのswitch
で同様のことを行うことができます。
関数getrolelevevel($ role){ switch($ role){ ケース「管理者」:9を返します。 ケース「モデレーター」:5を返します。 ケース「ユーザー」:1を返します。 デフォルト:0を返します。 } }
これにより、 break
ステートメントが回避され、関数の意図がより明確になります。各ケースは値を直接返します。
6.休憩なしでケースのグループ化(意図的にフォールスルー)
フォールスルーはしばしばバグですが、コードを複製せずに行動をグループ化するために意図的に使用できます。
switch($ httpcode){ ケース400: ケース401: ケース403: logerror($ httpcode); //倒れます ケース404: SendClientError($ httpcode); 壊す; ケース500: triggeralert(); //倒れます ケース502: ケース503: RestArtService(); 壊す; }
ここ:
- 400、401、403ログを記録してから、エラーを送信します。
- 404はロギングをスキップしますが、それでもエラーが送信されます。
- 500アラートと再起動。
- 502と503は再起動します。
これにより、コードの複製が減少し、共有された動作が明確に表されます。
最終的な考え
PHPのswitch
ステートメントは、最初に表示されるよりも多用途です。 switch (true)
を使用して、フォールスルーを活用し、配列と組み合わせ、内部ループまたはリターンコンテキストを使用することにより、より表現力豊かで保守可能なコードを記述できます。
毎回match
(PHP 8)または長いif-elseif
チェーンに到達する必要はありません。特に創造的に使用する場合、古い学校のswitch
適切なツールである場合があります。
基本的に、単純な文字列または整数のマッチングにのみswitch
を使用している場合、見逃しています。
以上がおそらく使用していない高度なPHPスイッチテクニックの詳細内容です。詳細については、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
強力な PHP 統合開発環境

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

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

switchcanbeslyfasterthanif-elsewhencomparingsing liabariableagain stiplescalalarues、特にマネイセイセセソールティグアーズデュートープロシブルオプティイゼーション;

PHPのスイッチステートメントは、式評価とゆるい比較を通じて一致するコードブロックを実行します。これは、マルチブランチ制御プロセスでよく使用されます。 1。予期しないフォールスルーを防ぐために、ブレークを使用する必要があります。 2。スイッチはゆるい比較(==)を使用します。これは、タイプの暗黙的な変換につながり、型の一貫性に注意を払う可能性があります。 3.休憩を省略することにより、複数のケースの論理マージを意図的に実装できます。 4.ユーザーロールやフォームアクションなどの個別の値シナリオを処理するのに適しています。 5. PHP8によって導入された一致式は、厳密な比較と発現のリターンを提供します。これは、より安全な現代的な代替手段です。 6.単純なマッピングは、ヌルマージ演算子と組み合わせた連想配列で実装できます。スイッチを正しく使用すると、生成が改善される可能性があります

ポリシーパターンを使用して、タイプまたは状態に基づいて拡張可能なポリシークラスに基づいて複雑な条件ロジックを置き換えます。 2.各オブジェクトが単独でその動作を実現できるように、多型を介したタイプのチェックを排除します。 3.単純な値から価値への価値へのマッピングをルックアップテーブル(辞書など)に置き換えます。 4.ガード条項を使用して事前に戻ってネスティングレベルを下げます。 5.条件付きロジックに名前を付けて分離する方法を抽出します。これらの再構築方法は、複雑な条件付きステートメントを明確で保守可能なコードに変換し、読みやすさとスケーラビリティを改善し、開閉の原則に完全に従い、最終的にクリーンで表現力のあるデザインを実現します。

KeepCasesFocusedByDelegatingComplexLogictedectedFunctions;

タイプまたは状態に基づいたスイッチステートメントが表示された場合、コードの品質を改善するために多型に置き換える必要があります。 1.抽象的なベースクラスの順序を定義し、各注文タイプが独自のプロセスメソッドを実装できるようにすることにより、オブジェクト内の動作をカプセル化します。 2。クライアントコードは、条件付き判断なしにorder.process()を直接呼び出します。 3.注文タイプを追加する場合、既存のコードを変更せずに新しいクラスを追加するだけで、開閉の原則に準拠しています。 4.スイッチは、断面ロジックや外部データ処理などのシナリオで保持できますが、工場またはポリシーモードを使用したパッケージの場合は考慮する必要があります。 5。複雑な動作については、ポリシーパターンを導入できます。アルゴリズムを独立してカプセル化し、ダイナミックに注入してデカップリングを実現できます。最後に、スケーラブルで維持しやすく、非常にまとまりのあるコード構造を取得できます

はい、PHP自体のスイッチステートメントはコードの臭いではありませんが、複数のファイルで繰り返され、ブランチが多すぎるか、ビジネスロジックと密接に結合され、単一の責任の原則に違反するか、オブジェクトタイプに基づいて判断を下すと、アンチパターンになります。 1.ポリシーモードの使用ファクトリの使用:処理インターフェイスとコンクリートクラスを定義し、工場出荷時のマッピングを介してプロセッサにマップし、新しいタイプを追加するには登録のみが必要であり、既存のコードの変更はありません。 2。クラスベースの分布を使用します(多型):オブジェクト自体が動作を決定し、抽象クラスを継承することにより具体的なロジックを実装し、切り替えずに呼び出すときにメソッドを直接実行させます。 3。閉鎖マッピングを使用します(単純なシナリオに適しています):連想配列を使用して、型のマッピングを閉鎖に保存し、ブランチ構造を回避しますが、テストが少なくなります。 4。PHP8を使用できます

theswitchstatementinphpisnotinhertinventy-fasterthanif-elseif; 1)Zendenginginginitypilesswitchinear lycheckedopcodes、resullingino(n)performurformostcase;

useswitch(true)forbooleanconditionstocreateacleanconditionalrouter.2.combineswitchwithin_array()tohandlegroupedactionseffisity.3.enforcestricttypechcksusing =========
