PHP:是带有低效字符串的switch-case语句吗?

时间:2011-04-12 08:34:16

标签: php performance string switch-statement

在我的PHP层中,我收到错误代码为字符串(“NOT_FOUND”,“EXPIRED”等)。这是一个可能字符串的小列表,可能是十几个。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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< 5.3您可能会调查call_user_func以动态调度错误处理函数。

答案 2 :(得分:0)

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

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