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