PHP では、switch
ステートメントがコントロールです。プログラム 特に複数の条件付き分岐を処理する場合のワークフローのための強力なツール。 ただし、クリーンで効率的な変換を達成するには、独自の障害が伴います。 この記事では、「switch」コマンドの品質をチェックしてコードの品質を確保し、パフォーマンスを最適化するための基本的なヒントと実践方法について説明します。
最初に考慮すべきことは、スイッチ
ですステートメント default
ケースを含めるかどうか。 #Adefault はフォールバック オプションとして機能し、#case## が定義されていない場合でもコードが実行されるようにします。 # マッチ。
default
は常に存在する必要があります。 実際、コマンド match
は、switch
が失敗した場合の代替バージョンです。 match anythingcase
があり、default
が欠落している場合は、例外がスローされます。
<?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; } ?>
default
別の目的を果たします:
switch
により、限られたケースのリストが確実に処理されます。 次に、正当な状況以外の状況がコマンドに到達した場合は常に例外をスローする必要があります。 <?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; default: throw new MyException('This should be zero or one'); } ?>
スイッチにデフォルト値が設定されていることを常に確認してください。
检查switch
陈述中是否有重复案例是有回报的。PHP 只处理它遇到的第一种情况,忽略其他情况。这会导致死代码,开关中的一些分支将被忽略并且永远不会被使用。
<?php switch($a) { case 'gif': // doSomething() and break case 'jpeg': case 'jpg': // doSomething() and break case 'png': // doSomething() and break case 'gif': // doSomething() and break default: throw new MyException('This should be an image format'); } ?>
重复的情况经常发生在很长的案例列表中。
当实际值被常量名称或 PHP 的类型杂耍隐藏时,也会发生这种情况。确实,switch
使用了宽松的比较风格,有些文字实际上可能是相同的。
<?php // $a in [null, false, '', 0] switch($a) { // Most of the cases ends here, except 0 // because it is the first encountered case '': print 'Empty string';break; // 0 goes here case 0: print 'Zero';break; case false: print 'false';break; case null: print 'null';break; default: throw new MyException('This should be empty'); } ?>
仔细检查案例值并删除重复项。
另一个常见问题是不同 case 分支中的代码块重复。这种冗余会使您的系统变得臃肿switch
,并且使将来的更新变得困难。考虑重构代码以消除重复并合并案例。
<?php switch($a) { case 'john': $b = 0; break; case 'henry': $b = 10; break; // duplicate of case 'john' case 'julia': $b = 0; break; case 'jeroen': $b = 30; break; default: throw new MyException('This is an unexpected name'); } ?>
PHP 内置了对枚举的支持。枚举的重要优点之一是其有限性。它们代表选项的完整集合,并且不存在其他选项。这使得检查 a 是否switch
涵盖了所有可能的情况变得很容易。
<?php enum formats { case GIF; case JPG; case PNG; } switch($a) { case formats::GIF: // doSomething() and break; case formats::PNG: // doSomething() and break; // We are missing one case : JPG! // Unknown cases triggers an exception lazily (only if reached) case formats::TIFF: // doSomething() and break; default: throw new MyException('Unknown image format'); } ?>
PHP 7.2 引入了针对switch
.
在此之前,PHP 会逐个检查每个案例,并在找到匹配值后立即停止。在 PHP 7.2 及更高版本中,当大小写值是简单文字时,PHP 会为它们设置一个查找表。然后,PHP 立即跳转到正确的情况,并绕过所有其他不匹配的情况。
<?php switch($a) { case 1: // doSomething() and break; case 2: // doSomething() and break; default: throw new MyException('Unknown image format'); } ?>
当所有情况都是简单值时,就会发生简单切换,可以直接与传入变量进行比较。
如果开关混合了表达式和简单值,建议将简单文字放在第一个开关中switch
,并将其他文字放在第二个开关中。
<?php switch($a) { case 1: // doSomething() and break; case 2: // doSomething() and break; default: switch($a) { case $b + 2: // doSomething() and break; case strtolower($a): // doSomething() and break; default: throw new MyException('Unknown case'); } } ?>
以不同的方式处理它们也可能更方便,例如使用先前的条件。
つまり、switch
PHP で適切に構造化されたステートメントを使用すると、文の明瞭さが大幅に向上します。コードの程度、保守性、パフォーマンス。 不足しているデフォルト エントリをチェックし、重複するケースやコード ブロックを削除し、列挙型の構造を活用し、複雑なスイッチを最適化することで、ステートメントが引き続き スイッチであることを確認できます。
PHP コード ベースの効率的かつ効果的な部分。
以上がPHP の実践的なスイッチ コマンドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。