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