【问题标题】:PHP: are switch-case statements with strings inefficient?PHP:带有字符串的 switch-case 语句效率低下吗?
【发布时间】:2011-08-03 16:44:07
【问题描述】:

在我的 PHP 层中,我收到了字符串形式的错误代码(“NOT_FOUND”、“EXPIRED”等)。这是可能的字符串的一小部分,可能有十几个。

处理这些问题的最有效方法是什么?对存储在类中的字符串常量使用 switch-case,还是我应该先将它们解析为数字(或其他东西)?还是 PHP 足够聪明,所以这并不重要?

【问题讨论】:

  • 别担心!你说的最多是几个处理器周期的差异,你不会注意到的。以最具可读性和可维护性的方式编写它。
  • @deceze 是的,你可能是对的,但是如果你不得不改变一个值,那么使用纯字符串是一个糟糕的方法......使用静态类常量,一个简单的折射器应该可以做到(希望 ; )
  • @Michael 这与我写的关于可维护性的内容一致。 性能不应成为决定因素。

标签: php performance string switch-statement


【解决方案1】:

您可能想考虑使用常量?假设您有一个类 Error 并在其中定义所有错误代码,如下所示:

class Error {
   const NOT_FOUND = 0;
   const EXPIRED = 1;
   // and so forth
}

然后您可以通过像Error::NOT_FOUND 那样访问它们来在您的代码中使用它们,switch 语句不需要比较字符串,而是具有纯整数,而不会降低可读性。

【讨论】:

  • 是的,那是我的另一个选择。但是由于代码是字符串,而不是数字,而且 PHP 无论如何都可以在 switch-case 语句中处理字符串或作为数组的索引,有没有一点将它们映射到像这样的整数?
  • @PapaFreud 不,当然你可以选择你想要的常量。
【解决方案2】:

这真的取决于你想对字符串做什么。你想输出错误信息吗?然后,您可以使用这样的查找表来代替 case 语句:

$messages = array(
  'NOT_FOUND' => 'The file was not found',
  'EXPIRED' => 'The cookie expired'
  // ETC
);
echo empty($messages[$error]) ? "Unknown error" : $messages[$error];

使用 PHP 5.3,您还可以将代码存储在数组中以处理错误情况:

$handlers = array(
  'NOT_FOUND' => function() { /* Error handling code here */ },
  'EXPIRED' => function() { /* Other error handling code */ }
 );
 if(!empty($handlers[$error])) { 
   $handler = $handlers[$error];
   $handler();
 }
 else {
   echo "Could not handle error!"; die();
 }

使用这样的技术,您可以避免跨越几页的案例陈述。

对于 PHP call_user_func 以获取错误处理函数的动态分派。

【讨论】:

    【解决方案3】:

    字符串不能被识别为类常量。但是你的问题的答案是,如果你这样做并不重要:

    switch (className::{$errorCode}) { // $errorCode == name of the constant, like NOT_FOUND
    // Cases here.
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多