Intereting Posts
многострадальный PHP-скрипт и способы решения проблемы? Лучшая дизайнерская практика для реализации маршрутов и контроллеров для приложения RESTFul Laravel Если isset $ _POST Предыдущие / следующие кнопки? Обновление нескольких индикаторов выполнения при отправке нескольких файлов и элементов формы через ajax Как преобразовать этот JSON в php-массив, а также как получить только определенные значения php – получить числовой индекс ассоциативного массива PHP – Ошибочная петля алфавита Отправка HTML-адреса электронной почты на php? Использование TCPDF для преобразования определенного div в PDF Получите HTML с текущими стилями (возможно, вложенными) страницы, которая закончила рендеринг и закончила выполнение сценариев Получите Facebook UID на вкладке страницы без запроса разрешения PHP / MySQL: лучшие методы работы / хранения денег? как реализовать систему входа под php? Какое из правил кодирования следует для PHP?

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

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

Related of "Условное присвоение значений PHP"

PHP 5.3 представил новый синтаксис для решения именно этой проблемы:

 $x = expensive() ?: $default; 

См. Документацию :

Начиная с PHP 5.3, можно исключить среднюю часть тернарного оператора.
Expression expr1 ?: 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