如果您来自没有“elseif”构造的另一种语言(例如 C++),那么认识到“else if”是嵌套的语言构造,“elseif”是线性的语言构造非常重要;它们的性能可能与递归循环相比与迭代循环相当。
<?php
$limit=1000;
for($idx=0;$idx<$limit;$idx++)
{ $list[]="if(false) echo \"$idx;\n\"; else"; }
$list[]=" echo \"$idx\n\";";
$space=implode(" ",$list);| $nospace=implode("",$list); $start=array_sum(explode(" ",microtime()));
eval($space);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
$start=array_sum(explode(" ",microtime()));
eval($nospace);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
?>
此测试应显示“elseif”的执行时间大约是“else if”的三分之二。(增加 $limit 最终也会导致解析器堆栈溢出错误,但发生这种情况的级别在现实世界中是荒谬的。没有人会正常地将 if() 块嵌套到超过一千个级别,除非他们试图破坏东西,这是一个完全不同的问题。)
仍然需要“else if”,因为您可能在阶梯的某个环节处需要执行其他无条件的代码;“else if”构造允许将此无条件代码优雅地插入整个过程的前面或后面。考虑以下 elseif() 阶梯
<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
elseif($e) { conditional5(); }
elseif($f) { conditional6(); }
elseif($g) { conditional7(); }
elseif($h) { conditional8(); }
else { conditional9(); }
?>
要为 $e 及其后的部分插入无条件的预处理代码,只需拆分“elseif”
<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
else {
....unconditional();
....if($e) { conditional5(); }
....elseif($f) { conditional6(); }
....elseif($g) { conditional7(); }
....elseif($h) { conditional8(); }
....else { conditional9(); }
}
?>
另一种方法是在整个构造中复制无条件代码。