Эквивалент PHP для Ruby или-equals (foo || = bar)?

В PHP я часто пишу строки вроде

isset($foo)? NULL : $foo = 'bar'

В рубине есть яркий ярлык для него, называемый или равно

foo ||= 'bar'

Есть ли у PHP такой оператор, вызов ярлыка или метода? Я не могу найти его, но я, возможно, пропустил его.

Ответ 1

Начиная с PHP7, вы можете использовать Null Coalesce Operator:

Добавлен оператор coalesce или ??, который возвращает результат своего первого операнда, если он существует, и не является NULL, или его второй операнд.

Итак, вы можете написать:

$foo = $foo ?? 'bar';

и он будет использовать $foo, если он установлен, а не null или назначить "бар" на $foo.

В боковом поле пример, который вы даете тернарному оператору, должен действительно читать:

$foo = isset($foo) ? $foo : 'bar';

Тройная операция не является сокращенной структурой if/else, но она должна использоваться для выбора между двумя выражениями в зависимости от третьего, а не для выбора двух предложений или путей выполнения

Ответ 2

Мне очень нравится оператор?:. К сожалению, он еще не реализован в моей производственной среде. Итак, если бы я сделал этот взгляд рубиновым, я бы пошел на что-то вроде:

isset($foo) || $foo = 'bar';

Или, если вы хотите, чтобы он был еще короче (медленнее и может давать неожиданные результаты):

@$foo || $foo = 'bar';

Ответ 3

Вы можете создать свою собственную функцию:

function setIfNotSet(&$var, $value) {
    if(!isset($var)) {
        $var = $value;
    }
}

Ответ 4

Я нахожу его читабельным, лаконичным и реалистичным:

isset($foo) or $foo = 'bar';

Ответ 5

С PHP 5.3 можно использовать $foo ?: 'bar' Если вы не ожидаете, что $foo будет false

[править]

Забудьте об этом. Он по-прежнему вызывает E_NOTICE, если $foo не установлен.

Ответ 6

Из руководства:

С PHP 5.3 можно исключить среднюю часть тернарного оператора. Expression expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE и expr3 в противном случае.

Это не совсем то же самое. Надеюсь, он все равно поможет.

Ответ 7

Нет. Согласно w3schools, этого оператора не существует.

Кроме того, написанный вами PHP-код является довольно загадочным. Я предпочитаю что-то вроде этого:

if (!isset($foo)) $foo = 'bar';

Ответ 8

Самый похожий на ruby:

$foo or $foo = 'bar';

$foo ложно, если

$foo = 0;
$foo = '0';
$foo = NULL;
$foo = '';
$foo = array();
$foo = FALSE;