Есть ли в PHP короткое замыкание ИЛИ, которое возвращает крайнее левое значение? - PullRequest
21 голосов
/ 08 октября 2009

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

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

То есть, ИЛИ будет закорачивать, оценивая значения только слева направо, пока не найдет истинное значение. Но кроме того, он возвращает фактическое значение , которое было оценено, а не true.

В приведенном выше примере в PHP $a будет значением 1, если $a или $b не являются ложными значениями или die.

Так написал функцию first, которая будет использоваться как

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

, который возвращает значение либо $a, либо $b. Но он не закорачивается - он всегда будет die.

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

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

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

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

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

Ответы [ 6 ]

28 голосов
/ 08 октября 2009

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

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

10 голосов
/ 08 октября 2009

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

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

или я что-то упустил?

2 голосов
/ 08 октября 2009

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

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

$a = coalesce($a, $b) or die("no value");
1 голос
/ 02 апреля 2016

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

$ a = $ b ИЛИ $ c ИЛИ умереть («нет значения»);

становится

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

Причина, по которой OR не работает, заключается в том, что вместо возврата первого или последнего значения возвращается значение true или false.

1 голос
/ 08 октября 2009

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

function coalesce($funcs)
{
    foreach ($funcs as $func)
    {
        //Catch language constructs
        switch($func)
        {
            case 'die':
                die();
        }
        $result = $func();
        if ($result)
        {
            return $result;
        }
    }
}
0 голосов
/ 09 октября 2009

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

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ?  $f2 : func3()) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...