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

На некоторых языках вы можете

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

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

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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Есть ли короткое замыкание ИЛИ в PHP, которое возвращает самое левое значение?"

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

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

или я что-то упускаю?

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

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

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

 function coalesce() { foreach (func_get_args() as $arg) { if ($arg) { return $arg; } } return null; } $a = coalesce($a, $b) or die("no value"); 

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

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

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

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

становится

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

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

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

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