Подтвердить что ты не робот

Есть ли короткое замыкание ИЛИ в PHP, которое возвращает самое левое значение?

На некоторых языках вы можете сделать

$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.

Существует ли короткое замыкание OR в PHP, которое возвращает фактическое значение?

Edit: Некоторые хорошие ответы на пример, который я дал, но я думаю, что мой пример не совсем то, что я имел в виду. Позвольте пояснить.

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

Где каждая из этих функций действительно действительно интенсивно вычисляется, поэтому я хочу только один раз оценить каждое выражение. И для первого, чтобы вернуть истинное значение, я хочу, чтобы фактическое значение сохранялось в $a.

Я думаю, что мы можем исключить запись функции, потому что она не будет замыкаться. И ответ условного оператора будет оценивать каждое выражение дважды.

4b9b3361

Ответ 1

Вы можете использовать только:

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

или я что-то не хватает?

Ответ 2

Нет, это не так, и это, на мой взгляд, одно из плохих решений, которые Rasmus Lerdorf сделал при разработке PHP, который наиболее критиковал компетентных разработчиков ради того, чтобы обучать некомпетентных.

Изменить: в PHP 5.3 и выше вы можете написать $a = $b ?: $c и даже $a = $b ?: $c ?: $d. Все еще не так хорошо, как логические операторы, не поврежденные мозгом, но это что-то.

Ответ 3

Вы можете использовать coalesce функцию:

function coalesce() {
    foreach (func_get_args() as $arg) {
        if ($arg) {
            return $arg;
        }
    }
    return null;
}

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

Ответ 4

Как насчет переменных функций?

function coalesce($funcs)
{
    foreach ($funcs as $func)
    {
        //Catch language constructs
        switch($func)
        {
            case 'die':
                die();
        }
        $result = $func();
        if ($result)
        {
            return $result;
        }
    }
}

Ответ 5

Извините, но большинство из этих ответов просто выключено.

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

становится

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

Причина ИЛИ не работает в том, что вместо того, чтобы возвращать прежнее или последнее значение, он возвращает true или false.

Ответ 6

Это должно работать:

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ?  $f2 : func3()) );