PHP эквивалент для Ruby's or-equals (foo || = bar)? - PullRequest
20 голосов
/ 29 июля 2010

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

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

В ruby ​​есть блестящий ярлык для этого, который называется или равен

.
foo ||= 'bar'

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

Ответы [ 8 ]

21 голосов
/ 29 июля 2010

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

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

Таким образом, вы можете написать:

$foo = $foo ?? 'bar';

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

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

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

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

8 голосов
/ 26 января 2011

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

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

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

@$foo || $foo = 'bar';
5 голосов
/ 15 июня 2012

Я считаю это читабельным, лаконичным и производительным, чтобы просто сделать:

isset($foo) or $foo = 'bar';
5 голосов
/ 29 июля 2010

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

function setIfNotSet(&$var, $value) {
    if(!isset($var)) {
        $var = $value;
    }
}
3 голосов
/ 29 июля 2010

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

[править]

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

2 голосов
/ 29 июля 2010

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

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

Это не совсем то же самое.Надеюсь, это поможет в любом случае.

1 голос
/ 29 июня 2014

Самое похожее с ruby ​​это:

$foo or $foo = 'bar';

$ foo равно false, если

$foo = 0;
$foo = '0';
$foo = NULL;
$foo = '';
$foo = array();
$foo = FALSE;
1 голос
/ 29 июля 2010

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

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

if (!isset($foo)) $foo = 'bar';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...