PHP中是否存在短路OR,它返回最左边的值?

时间:2009-10-08 17:09:30

标签: php logic

在某些语言中,您可以

$a = $b OR $c OR die("no value");

也就是说,OR将短路,仅从左到右评估值,直到找到真值。但另外,它返回 评估的实际值,而不仅仅是true

在上面的示例中,在PHP中,如果$a1为非假值,则$a将为值$b,或die }}

所以写了一个函数first,用作

$a = first($a, $b, die("no value"));

返回$a$b。但是,它不会短路 - 它总是die

PHP中是否有短路OR返回实际值?

修改: 我给出的例子有一些很好的答案,但我想我的例子并不完全是我的意思。让我澄清一下。

$a = func1() OR func2() OR func3();

其中每个函数都执行非常强烈的计算,所以我只想最多评估一次表达式。并且为了第一个返回真值,我希望实际值存储在$a中。

我认为我们可以排除编写函数,因为它不会短路。条件运算符答案将对每个表达式进行两次评估。

6 个答案:

答案 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()) );