Эквивалент 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;