Для очень распространенного случая присвоения значения переменной на основе результата выражения я поклонник тернарных операторов:
$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());
Так много вариантов, ни один из них не является действительно удовлетворительным. Что бы вы использовали, и я упустил что-то действительно очевидное здесь?