快速处理的最佳方式

时间:2009-12-03 15:03:01

标签: php performance css-selectors

作为一个PHP程序员面对很多(深入)语句,我很好奇你是如何处理这个问题的。您使用的是switch,if-elseif-else还是if-else结构?

我个人更喜欢在处理超过2种情况时使用开关选择器。从性能角度来看,这也是最佳方式吗?嵌套语句怎么样?

我很想你喜欢的方法和答案。

实施例

需要三选项选择器:

使用开关:

switch($option)
{
  case 1 : $result= "foo"; break;
  case 2 : $result= "bar"; break;
  default : $result= "foobar";
}

使用if-elseif-else

if($option == 1)
{
  $result= "foo";
} elseif ($option == 2)
{
  $result= "bar";
} else
{
  $result= "foobar";
}

使用if-if-else

if($option == 1)
{ 
  $handle = "foo";
}
if($option == 2)
{
  $result = "bar";
}
else
{
  $result = "foobar";
}

5 个答案:

答案 0 :(得分:1)

当你在许多情况下共享一条逻辑时,我发现交换机很方便。 即

case 1:
case 2:
case 3:
    // do stuff for 1, 2 and 3
    break;
case 4:
    // other stuff just for 4
    break;
default:
    // fallback for everything else
    break;

同样重要的是要注意切换执行loose comparison,这在某些情况下可能是不受欢迎的

从绩效角度来看,没有太多话要说

答案 1 :(得分:1)

除了新手程序员之外,每个人都知道switchif..else更快,但switch无法替换您在if中放置的每个复合表达式语句(例如两个带有逻辑AND的表达式)

另外,如果您正在谈论像这样的深层嵌套代码

function foo()
{
  if ( /* expr1 */ )
  {
    // code

    if ( /* expr2 */ )
    {
      // code 

      if (  /* expr3 */ )
      {
        // code
        if ( /* expr4 */ )
        {
          // code          
        }
      }
    }
  } 
}

然后我只能说,请停止这样做。有一些保护条件将迫使函数提前退出。以上是用这种风格重写的。

function foo()
{
  if ( !/* exp r1 */ )
  {
    return;
  }
  // code 1

  if ( !/* expr 2 */ )
  {
    return;
  }
  // code 2

  if ( !/* expr 3 */ )
  {
    return;
  }
  // code 3

  if ( !/* expr 4 */ )
  {
    return;
  }
  // code 4
}

当然,通过添加更多功能,真实应用程序中的这些都可能会更好地重构。

答案 2 :(得分:1)

我想说如果你看看这三个例子,最容易选择的是最漂亮和最干净的例子:switch语句。如果你能接受开关的松散比较,那就选择它。在这个层面上,性能方面的考虑通常是毫无意义的,因为潜在的收益是微不足道的。

答案 3 :(得分:1)

我通常更喜欢使用最新颖,最易理解的方法。但是,我尽量避免问这个问题。必须在代码中使用大量if / else块表示您的设计存在问题 鉴于创建关联数组很容易,没有理由不能将键映射到函数或值,这些函数或值可能会比除了普通数据集之外的任何东西都优于switch语句。或者甚至更好地使用polymorphism这是一个更简洁的解决方案,并且经常将大的if或switch块转换为单个函数调用。

答案 4 :(得分:1)

如果您需要这种微优化,则应使用其他语言。 作为一个懒惰的程序员,我喜欢去做这类事情:

class blabla{
  private $_actions;
  public function __construct(){
    $this->_actions = array(1 => '_firstAction',
                            2 => '_secondAction',
                            3 => '_thirdAction');

  }
  public function whatever($choice){
    if(isset($this->_actions[$choice])){
      $this->{$this->_actions[$choice]}();
    }
  }
  private function _firstAction(){}
  private function _secondAction(){}
  private function _thirdAction(){}
}
相关问题