2
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;
    }

What do you say about the above code? I am trying to decide if I should use curly braces on my case arms or not. Each case in my example only has one line of code, so I am not using curly braces. Is there a performance difference between using with or without curly braces?

4

3 回答 3

8

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

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

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

不,这不是语法错误。

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

于 2014-10-17T08:53:08.083 回答
0

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

于 2021-11-12T01:48:20.780 回答
0

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

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

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

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

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

代码:(演示

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 及更高版本开始,您还可以享受块的简洁性,match()开关和查找数组的漂亮孩子。

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

$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,或者如果您计划在多个地方/方式使用查找数组并且具有单点参考提供了一些额外的好处。

于 2021-11-12T02:43:20.453 回答