На некоторых языках вы можете
$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
.
Я думаю, что мы можем исключить возможность написания функции, потому что она не будет замыкаться. И условный операторный ответ будет оценивать каждое выражение дважды.
Вы можете использовать только:
$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()) );