Условное присвоение значений PHP
Для очень распространенного случая присвоения значения переменной на основе результата выражения я являюсь поклонником тройных операторов:
$foo = $bar ? $a : b;
Однако, если $bar является относительно дорогой операцией, и я хочу присвоить результат $bar $foo, если результат правдивый, это неэффективно:
$foo = SomeClass::bigQuery() ? SomeClass::bigQuery() : new EmptySet();
Один из вариантов:
$foo = ($result = SomeClass::bigQuery()) ? $result : new EmptySet();
Но я предпочел бы, чтобы в памяти не было дополнительного $result
.
Самый лучший вариант, который у меня есть:
$foo = ($foo = SomeClass::bigQuery()) ? $foo : new EmptySet();
Или, без тернарных операторов:
if(!$foo = SomeClass::bigQuery()) $foo = new EmptySet();
Или, если операторы потока программы не являются вашим стилем:
($foo = SomeClass::bigQuery()) || ($foo = new EmptySet());
Так много вариантов, а не их действительно удовлетворительных. Что бы вы использовали, и я пропустил что-то действительно очевидное здесь?
Ответы
Ответ 1
PHP 5.3 представил новый синтаксис для решения именно этой проблемы:
$x = expensive() ?: $default;
Смотрите документация:
С PHP 5.3 можно исключить среднюю часть тернарного оператора.
Выражение expr1 ?: expr3
возвращает expr1
, если expr1
оценивается как TRUE
и expr3
в противном случае.
Ответ 2
Можете ли вы обновить SomeClass: bigQuery(), чтобы вернуть новый EmptySet() вместо false?
Тогда у вас есть
$foo = SomeClass::bigQuery();
Ответ 3
$foo = SomeClass::bigQuery();
if (!$foo) $foo = new EmptySet();
Вторая редакция, кредит @meagar
Ответ 4
Небольшое изменение вашей последней опции:
$foo = SomeClass:: bigQuery() или новый EmptySet(); на самом деле это не работает, спасибо, что заметили.
Используется часто в сочетании с кодом mySQL, но, как всегда, забывается в сопоставимых ситуациях:
$result = mysql_query($sql) or die(mysql_error());
Хотя лично я предпочитаю тот, о котором вы уже упоминали:
if(!$foo = SomeClass::bigQuery())
$foo = new EmptySet();