Что такое нулевое объединение присваивания ?? = оператор в PHP 7.4


10

Я только что посмотрел видео о новых возможностях PHP 7.4 и увидел этого ??=нового оператора. Я уже знаю ??оператора. Как это отличается?

Ответы:


10

Из документов :

Coalesce равный или ?? = оператор является оператором присваивания. Если левый параметр равен нулю, присваивает значение правому параметру левому. Если значение не нулевое, ничего не делается.

Пример:

// The folloving lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';

Таким образом, это просто сокращение для присвоения значения, если оно не было назначено ранее.


4
Также похоже, что мы нашли опечатку в официальных документах. The folloving lines...
Павел Линт

не на 100% точно, что две строки работают «одинаково», во втором случае левая часть вычисляется только один раз, поэтому это более эффективно
the_nuts

7

В PHP 7 это было первоначально выпущено, позволяя разработчику упростить проверку isset () в сочетании с троичным оператором. Например, до PHP 7 у нас мог бы быть этот код:

$data['username'] = (isset($data['username']) ? $data['username'] : 'guest');

Когда был выпущен PHP 7 , мы получили возможность написать это так:

$data['username'] = $data['username'] ?? 'guest';

Однако теперь, когда выйдет PHP 7.4 , это можно упростить еще дальше:

$data['username'] ??= 'guest';

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


4

Оператор присваивания нулевого объединения - это краткий способ присвоения результата оператору объединения нулей.

Пример из официальных заметок о выпуске :

$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.