【问题标题】:Advantaged and disadvantages of using switch statements without curly braces使用不带花括号的 switch 语句的优缺点
【发布时间】:2012-11-22 23:35:09
【问题描述】:
switch($_SERVER["SCRIPT_NAME"]){
    case "/index.php":
            $this->pageId = 1;
        break;
    case "/shops/index.php":
            $this->pageId = 2;
        break;
    case "/shops/dailydeals.php":
            $this->pageId = 4;
        break;
    case "/shops/shops.php":
            $this->pageId = 5;
        break;
    case "/shops/deals.php":
            $this->pageId = 9;
        break;
    case "/shops/store.php":
            $this->pageId = 10;
        break;
    case "/user/cashmail.php":
            $this->pageId = 13;
        break;
    case "/user/cashmail.php":
            $this->pageId = 13;
        break;
    default ;
            $this->pageId = 1;
        break;
    }

你对上面的代码有什么看法?我正在尝试决定是否应该在我的 case 手臂上使用花括号。我的示例中的每个案例只有一行代码,所以我没有使用花括号。使用或不使用花括号之间是否存在性能差异?

【问题讨论】:

    标签: php performance syntax switch-statement conditional-statements


    【解决方案1】:

    我要为这个问题添加我自己的答案,因为接受的答案不正确。

    “多行”case 子句可以用大括号编写。是否应该完全取决于编写代码的开发人员和/或他们订阅的编码标准。

    我个人在我使用的每一种编程语言(从 C 开始)中都在 case 语句中使用花括号,因为我相信它可以创建更具可读性的代码。

    不,这不是语法错误。

    关于性能。嗯,PHP 是解释的,所以从技术上讲,它必须解释花括号。但是,您不应该为了这样微不足道的性能提升而牺牲可读性。特别是在像 PHP 这样的语言中,性能影响远远超出了解释器。

    【讨论】:

      【解决方案2】:

      应该使用花括号,以便 case 子例程可以为 folded 以提高可读性。

      【讨论】:

        【解决方案3】:

        我发现这个问题类似于:“我应该用脏海绵还是油腻海绵洗车?”答案当然是“都不是”。

        我认为没有令人信服的理由用 switch() 块的冗长来膨胀您的文件。因为您只是将一个值转换为另一个值,所以您只需要一个“映射”或“查找”数组即可利用。

        这将帮助您发现愚蠢的编码错误,例如在您的 switch 块中复制一个案例(例如):

        case "/user/cashmail.php":
                $this->pageId = 13;
            break;
        

        查找的优点是代码简洁,更容易(用人眼)扫描和维护。它也非常快,因为 php 在寻找数组中的键值方面做得非常出色。我还应该声明,因为您的查找数组值可以合理地假定为静态的,所以您可以安全地将它们声明为常量。一旦这个代码结构就位,您只需要维护查找数组而不需要处理代码行。

        代码:(Demo)

        define(
            'PATH_TO_PAGE_ID_LOOKUP',
            [
                "/index.php" => 1,
                "/shops/index.php" => 2,
                "/shops/dailydeals.php" => 4,
                "/shops/shops.php" => 5,
                "/shops/deals.php" => 9,
                "/shops/store.php" => 10,
                "/user/cashmail.php" => 13,
            ]
        );
        define('DEFAULT_PAGE_ID', 1);
        
        $this->pageId = PATH_TO_PAGE_ID_LOOKUP[$_SERVER["SCRIPT_NAME"]] ?? DEFAULT_PAGE_ID;
        echo $this->pageId;  // 9
        

        也就是说,从 PHP8 及更高版本开始,您还可以享受 a match() block 的简洁性,它是开关和查找数组的漂亮孩子。

        match() 控制结构可以如下所示:(Demo)

        $this->pageId = match ($_SERVER["SCRIPT_NAME"]) {
            "/index.php" => 1,
            "/shops/index.php" => 2,
            "/shops/dailydeals.php" => 4,
            "/shops/shops.php" => 5,
            "/shops/deals.php" => 9,
            "/shops/store.php" => 10,
            "/user/cashmail.php" => 13,
            default => 1,
        };
        
        echo $this->pageId; // 9
        

        这可能是在现代 php 中执行此任务的最简洁的方式。也许您不会使用这种技术的唯一原因是:如果您还没有使用 PHP8,或者如果您计划在多个地方/方式使用查找数组并且具有单点参考提供了一些额外的好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-14
          • 2018-05-05
          • 2017-06-14
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          • 2011-12-28
          相关资源
          最近更新 更多