以这种方式使用开关操作符是否合法,如果我想按顺序a,b,c打印第一个非空变量。 我看到的唯一问题是在某些条件成立的情况下。 我已经在5.6和7版本的php上测试了它 但它不会依赖于php的版本吗?
$a = '';
$b = '';
$c = 'c';
switch (true) {
case (!empty($a)) :
echo $a;
break;
case (!empty($b)) :
echo $b;
break;
default:
echo $c;
};
答案 0 :(得分:1)
您不依赖于此处的任何未记录的行为,并且在将来的任何PHP版本中都不会发生这种情况。
有时会讨论使用switch(true)
的技巧,好像它是一个额外的运算符,但它实际上只是switch语句工作的结果 - 每个case
条件都与使用switch
的{{1}}中的值,因此您每次都有效地检查==
。
您的代码:
$condition == true
它相当于:
switch (true) {
case (!empty($a)) :
echo $a;
break;
case (!empty($b)) :
echo $b;
break;
default:
echo $c;
}
由于您未使用任何内容,我们可以使用 if (true == !empty($a)) {
echo $a;
goto end;
}
if (true == !empty($b)) {
echo $b;
goto end;
}
// fallback
echo $c;
// goto target
end:
和goto
重写else
部分:
elseif
当然 if (true == !empty($a)) {
echo $a;
}
elseif (true == !empty($b)) {
echo $b;
}
else {
echo $c;
}
也是多余的:
true ==
只要每个 if (!empty($a)) {
echo $a;
}
elseif (!empty($b)) {
echo $b;
}
else {
echo $c;
}
都有一个对应的case
,根据switch语句的基本定义,这些不同的代码片段保证相同。到目前为止,最后一个是最常见的,因此最容易让其他人阅读您的代码。
与break
的最大区别在于,您可以"堕落"并以不同的方式结合案例。如果您需要这样做,那么switch
表单可能会有用。如果您不需要它,您应该通过使用正常的if-elseif链来避免意外掉落的风险。
答案 1 :(得分:0)
$a = '';
$b = '';
$c = 'c';
if(!empty($a)){
echo $a;
}elseif (!empty($b)){
echo $b;
}else{
echo $c;
}
elseif
是最好的和最一般的方式!