Подтвердить что ты не робот

Условное присвоение значений 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());

Так много вариантов, а не их действительно удовлетворительных. Что бы вы использовали, и я пропустил что-то действительно очевидное здесь?

4b9b3361

Ответ 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();