ホームページ >バックエンド開発 >PHPチュートリアル >PHP の実践的なスイッチ コマンド

PHP の実践的なスイッチ コマンド

DDD
DDDオリジナル
2023-10-09 10:26:351237ブラウズ

PHP で適切に構造化された Switch コマンドを確認する

PHP では、switch ステートメントがコントロールです。プログラム 特に複数の条件付き分岐を処理する場合のワークフローのための強力なツール。 ただし、クリーンで効率的な変換を達成するには、独自の障害が伴います。 この記事では、「switch」コマンドの品質をチェックしてコードの品質を確保し、パフォーマンスを最適化するための基本的なヒントと実践方法について説明します。

デフォルトのエントリがありません

最初に考慮すべきことは、スイッチですステートメント default ケースを含めるかどうか。 #Adefault はフォールバック オプションとして機能し、#case## が定義されていない場合でもコードが実行されるようにします。 # マッチ。

default は常に存在する必要があります。 実際、コマンド match は、switch が失敗した場合の代替バージョンです。 match anythingcase があり、default が欠落している場合は、例外がスローされます。

<?php
switch($a) {
    case 0:
      echo &#39;A&#39;;
      break;
       
    case 1:
      echo &#39;A&#39;;
      break;
}
 
?>

default 別の目的を果たします:

  • 他のすべてのケースは一緒に処理されます。 これは、限られたケースのリストが利用可能であり、そのリストの外にあるものはすべて 1 つの方法で処理できる場合です。
  • 到達するとエラーが発生します。 この場合、前述のコンテキスト switch により、限られたケースのリストが確実に処理されます。 次に、正当な状況以外の状況がコマンドに到達した場合は常に例外をスローする必要があります。
<?php
switch($a) {
    case 0:
      echo &#39;A&#39;;
      break;
       
    case 1:
      echo &#39;A&#39;;
      break;
       
    default:
      throw new MyException(&#39;This should be zero or one&#39;);
}
 
?>

スイッチにデフォルト値が設定されていることを常に確認してください。

重复案例

检查switch陈述中是否有重复案例是有回报的。PHP 只处理它遇到的第一种情况,忽略其他情况。这会导致死代码,开关中的一些分支将被忽略并且永远不会被使用。

<?php
switch($a) {
    case &#39;gif&#39;:
        // doSomething() and break
       
    case &#39;jpeg&#39;:
    case &#39;jpg&#39;:
        // doSomething() and break
 
    case &#39;png&#39;:
        // doSomething() and break
 
    case &#39;gif&#39;:
        // doSomething() and break
       
    default:
      throw new MyException(&#39;This should be an image format&#39;);
}
 
?>

重复的情况经常发生在很长的案例列表中。

当实际值被常量名称或 PHP 的类型杂耍隐藏时,也会发生这种情况。确实,switch使用了宽松的比较风格,有些文字实际上可能是相同的。

<?php
 
// $a in [null, false, &#39;&#39;, 0]
switch($a) {
    // Most of the cases ends here, except 0
    // because it is the first encountered
    case &#39;&#39;:
        print &#39;Empty string&#39;;break;
 
    // 0 goes here
    case 0:
        print &#39;Zero&#39;;break;
       
    case false:
        print &#39;false&#39;;break;
 
    case null:
        print &#39;null&#39;;break;
       
    default:
      throw new MyException(&#39;This should be empty&#39;);
}
 
?>

仔细检查案例值并删除重复项。

重复的代码块

另一个常见问题是不同 case 分支中的代码块重复。这种冗余会使您的系统变得臃肿switch,并且使将来的更新变得困难。考虑重构代码以消除重复并合并案例。

<?php
 
switch($a) {
    case &#39;john&#39;:
        $b = 0; break;
 
    case &#39;henry&#39;:
        $b = 10; break;
 
    // duplicate of case &#39;john&#39;
    case &#39;julia&#39;:
        $b = 0; break;
 
    case &#39;jeroen&#39;:
        $b = 30; break;
       
    default:
      throw new MyException(&#39;This is an unexpected name&#39;);
}
 
?>

枚举案例的使用

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(&#39;Unknown image format&#39;);
}
 
?>

通过简单开关进行优化

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(&#39;Unknown image format&#39;);
}
 
?>

当所有情况都是简单值时,就会发生简单切换,可以直接与传入变量进行比较。

如果开关混合了表达式和简单值,建议将简单文字放在第一个开关中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(&#39;Unknown case&#39;);
    }
}
 
?>

以不同的方式处理它们也可能更方便,例如使用先前的条件。

概要

つまり、switchPHP で適切に構造化されたステートメントを使用すると、文の明瞭さが大幅に向上します。コードの程度、保守性、パフォーマンス。 不足しているデフォルト エントリをチェックし、重複するケースやコード ブロックを削除し、列挙型の構造を活用し、複雑なスイッチを最適化することで、ステートメントが引き続き スイッチであることを確認できます。 PHP コード ベースの効率的かつ効果的な部分。

以上がPHP の実践的なスイッチ コマンドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。