В PHP я часто пишу строки вроде
isset($foo)? NULL : $foo = 'bar'
В рубине есть яркий ярлык для него, называемый или равно
foo ||= 'bar'
Есть ли у PHP такой оператор, вызов ярлыка или метода? Я не могу найти его, но я, возможно, пропустил его.
В PHP я часто пишу строки вроде
isset($foo)? NULL : $foo = 'bar'
В рубине есть яркий ярлык для него, называемый или равно
foo ||= 'bar'
Есть ли у PHP такой оператор, вызов ярлыка или метода? Я не могу найти его, но я, возможно, пропустил его.
Начиная с PHP7, вы можете использовать Null Coalesce Operator:
Добавлен оператор coalesce или
??, который возвращает результат своего первого операнда, если он существует, и не является NULL, или его второй операнд.
Итак, вы можете написать:
$foo = $foo ?? 'bar';
и он будет использовать $foo, если он установлен, а не null или назначить "бар" на $foo.
В боковом поле пример, который вы даете тернарному оператору, должен действительно читать:
$foo = isset($foo) ? $foo : 'bar';
Тройная операция не является сокращенной структурой if/else, но она должна использоваться для выбора между двумя выражениями в зависимости от третьего, а не для выбора двух предложений или путей выполнения
Мне очень нравится оператор?:. К сожалению, он еще не реализован в моей производственной среде. Итак, если бы я сделал этот взгляд рубиновым, я бы пошел на что-то вроде:
isset($foo) || $foo = 'bar';
Или, если вы хотите, чтобы он был еще короче (медленнее и может давать неожиданные результаты):
@$foo || $foo = 'bar';
Вы можете создать свою собственную функцию:
function setIfNotSet(&$var, $value) {
if(!isset($var)) {
$var = $value;
}
}
Я нахожу его читабельным, лаконичным и реалистичным:
isset($foo) or $foo = 'bar';
С PHP 5.3 можно использовать $foo ?: 'bar'
Если вы не ожидаете, что $foo будет false
[править]
Забудьте об этом. Он по-прежнему вызывает E_NOTICE, если $foo не установлен.
Из руководства:
С PHP 5.3 можно исключить среднюю часть тернарного оператора. Expression expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE и expr3 в противном случае.
Это не совсем то же самое. Надеюсь, он все равно поможет.
Нет. Согласно w3schools, этого оператора не существует.
Кроме того, написанный вами PHP-код является довольно загадочным. Я предпочитаю что-то вроде этого:
if (!isset($foo)) $foo = 'bar';
Самый похожий на ruby:
$foo or $foo = 'bar';
$foo ложно, если
$foo = 0;
$foo = '0';
$foo = NULL;
$foo = '';
$foo = array();
$foo = FALSE;