在某些语言中,您可以
$a = $b OR $c OR die("no value");
也就是说,OR将短路,仅从左到右评估值,直到找到真值。但另外,它返回 评估的实际值,而不仅仅是true
。
在上面的示例中,在PHP中,如果$a
或1
为非假值,则$a
将为值$b
,或die
}}
所以写了一个函数first
,用作
$a = first($a, $b, die("no value"));
返回$a
或$b
的值。但是,它不会短路 - 它总是die
。
PHP中是否有短路OR
返回实际值?
修改: 我给出的例子有一些很好的答案,但我想我的例子并不完全是我的意思。让我澄清一下。
$a = func1() OR func2() OR func3();
其中每个函数都执行非常强烈的计算,所以我只想最多评估一次表达式。并且为了第一个返回真值,我希望实际值存储在$a
中。
我认为我们可以排除编写函数,因为它不会短路。条件运算符答案将对每个表达式进行两次评估。
答案 0 :(得分:28)
不,没有,而且,在我看来,这是Rasmus Lerdorf在设计PHP时做出的一个错误决定,其中大多数人为了溺爱不称职的人而惹恼了有能力的开发人员。
编辑:在PHP 5.3及更高版本中,您可以编写$a = $b ?: $c
,甚至$a = $b ?: $c ?: $d
。仍然没有非脑损伤的逻辑运算符那么好,但它确实存在。
答案 1 :(得分:10)
您可以使用:
$a = func1() or $a = func2() or $a = func3();
或者我错过了什么?
答案 2 :(得分:2)
您可以使用某种coalesce
function:
function coalesce() {
foreach (func_get_args() as $arg) {
if ($arg) {
return $arg;
}
}
return null;
}
$a = coalesce($a, $b) or die("no value");
答案 3 :(得分:1)
变量函数怎么样?
function coalesce($funcs)
{
foreach ($funcs as $func)
{
//Catch language constructs
switch($func)
{
case 'die':
die();
}
$result = $func();
if ($result)
{
return $result;
}
}
}
答案 4 :(得分:1)
对不起,但这些答案大部分都是关闭的。
$ a = $ b OR $ c或死("没有价值");
变为
$a = $b ?: $c ?: die("no value");
OR不起作用的原因是,它返回true或false而不是返回前一个或后一个值。
答案 5 :(得分:0)
这应该有效:
$a = (($f1=func1()) ? $f1 : ($f2=func2()) ? $f2 : func3()) );