Что означает оператор двойного вопросительного знака (??) в PHP

Я погрузился в код фреймворка Symfony (версия 4) и нашел этот фрагмент кода:

$env = $_SERVER['APP_ENV'] ?? 'dev';

Я не уверен, что это на самом деле делает, но я полагаю, что он расширяется до чего-то вроде:

$env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';

Или, может быть:

$env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';

Есть ли у кого-нибудь какая-нибудь точность по этому поводу?

stackoverflow.com/a/3737177/5897602
Jaquarh 04.12.2018 11:21

Я только что обнаружил этот вопрос и, читая вашу правку, решил указать, почему вы ошибаетесь. Вам не нужно знать имя оператора, чтобы найти его, просто потому, что я думаю, что это довольно очевидно, что двойное "??" мог быть только «оператором» в PHP (особенно глядя на синтаксис в примере), поэтому этого простого предположения было достаточно, чтобы попытаться найти «операторы php» или «операторы php 7» в Google (обращая внимание на версию PHP, требуемую symfony 4) и найти ответ намного быстрее, чем писать вопрос здесь ( где, используя то же предположение, вы могли бы найти дубликат).

gp_sflover 04.12.2018 15:01

@gp_sflover для "операторов php 7" хорошо, у вас есть шансы найти. С "оператором php" ... удачи :) И это то, что сделал бы любой, кто никогда не видел его раньше. На мой взгляд, не совсем интуитивно думать, что это новая функция, которая была включена только в последнюю версию php. В любом случае, может я ошибаюсь, и мне просто нужно спать и просыпаться, чтобы понять это. Спасибо за ваше время :)

elkolotfi 04.12.2018 15:45

Я отмечаю это для повторного открытия. Это не просто набрать "php ??" или что-нибудь подобное в поле поиска, чтобы найти ответ. Даже сейчас, с этим вопросом "php" и "??" не будет отображать этот вопрос. Я рекомендую отредактировать заголовок, включив в него "??" так что другим будет легче найти. Во-вторых, @epixilog, отметив вопрос как повторяющийся, вы никоим образом не отразитесь на нем. Даже если он закрыт, он работал так, как задумал, когда вы нашли свой ответ. Он отмечен таким образом, чтобы мы могли хранить всю информацию вместе, а не осуждать людей, задающих вопросы.

Andrew T Finnell 04.12.2018 20:50

@AndrewTFinnell Меня беспокоит не повторяющееся упоминание, на самом деле это -5 отзывов, которые я получил на свой вопрос; (

elkolotfi 05.12.2018 09:22

Я поддержал, потому что я также искал в Google «двойной вопросительный знак PHP». Это первый результат и отлично отвечает.

Zim84 20.03.2019 20:42

То же самое и здесь, благодаря этому вопросу я только что нашел менее чем за 10 секунд, что ?? означает в PHP, буквально набрав «оператор двойного вопросительного знака php» и подтвердив то, что я думал. Отлично

kon 21.03.2019 13:44

Мой поиск по запросу "двойной вопросительный знак php" привел меня сюда; теперь, если бы я только знал, что это называлось "оператор объединения", будучи таким очевидным термином ... Проголосовали за. Может быть, если бы его можно было назвать оператором Мадди Уотерса, знаете ли, параллельно с оператором Элвиса ?:

Jonathan 10.07.2020 05:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
376
8
160 498
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

$x = $y ?? 'dev'

сокращенно для x = y, если y установлено, в противном случае x = 'dev'

Есть также

$x = $y = = "SOMETHING" ? 10 : 20

означает, что если y равно "ЧТО-ТО", то x = 10, в противном случае x = 20

Хороший $x = $y = = "SOMETHING" ? 10 : 20 Я этого не знал.

B001ᛦ 03.08.2021 23:08
$myVar = $someVar ?? 42;

Эквивалентно :

$myVar = isset($someVar) ? $someVar : 42;

Для констант поведение такое же при использовании константы, которая уже существуют:

define("FOO", "bar");
define("BAR", null);

$MyVar = FOO ?? "42";
$MyVar2 = BAR ?? "42";

echo $MyVar . PHP_EOL;  // bar
echo $MyVar2 . PHP_EOL; // 42

Однако для констант, которых не существует, это другое:

$MyVar3 = IDONTEXIST ?? "42"; // Raises a warning
echo $MyVar3 . PHP_EOL;       // IDONTEXIST

Warning: Use of undefined constant IDONTEXIST - assumed 'IDONTEXIST' (this will throw an Error in a future version of PHP)

Php преобразует несуществующую константу в строку.

Вы можете использовать constant("ConstantName"), который возвращает значение константы или null, если константа не существует, но при этом будет появляться предупреждение. Вы можете добавить к функции оператор контроля ошибок@, чтобы игнорировать предупреждающее сообщение:

$myVar = @constant("IDONTEXIST") ?? "42"; // No warning displayed anymore
echo $myVar . PHP_EOL; // 42

если (! isset ($ _ SESSION ['captchaReq'])) {$ _SESSION ['captchaReq'] = 1; } if (! isset ($ _ SESSION ['captchaReq']) || $ _SESSION ['captchaReq'] <= 3) {throw new \ Exception ('Captcha Req Error'); } еще {$ _SESSION ['captchaReq'] ++; }

Kamil Dąbrowski 16.12.2021 06:29

if (($ _ SESSION ['captchaReq'] ++ ?? $ _ SESSION ['captchaReq'] = 0) <3) {}

Kamil Dąbrowski 16.12.2021 06:34

@ KamilDąbrowski да? Что это?

Cid 16.12.2021 08:28

я не могу добавить пост, так как можно сократить код ?? . $ _SESSION ['numberRequests'] ++ ?? $ _ SESSION ['numberRequests'] = 0‌; это превосходная операция 3in1

Kamil Dąbrowski 17.12.2021 12:38

Если не можете, не беспокойтесь о сокращении кода. Код, который вы можете легко читать и поддерживать, намного лучше, чем что-то короткое

Cid 17.12.2021 14:16
Ответ принят как подходящий

Это «нулевой оператор объединения», добавленный в php 7.0. Определение того, как это работает:

It returns its first operand if it exists and is not NULL; otherwise it returns its second operand.

Так что на самом деле это просто isset() в удобном операторе.

Эти два эквивалента 1:

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

Документация: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce

В списке новых возможностей PHP7: http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

И оригинальный RFC https://wiki.php.net/rfc/isset_ternary


РЕДАКТИРОВАТЬ: Поскольку этот ответ получил много просмотров, небольшие пояснения:

1 Есть разница: в случае ?? первое выражение оценивается только один раз, в отличие от ? :, где выражение сначала оценивается в разделе условий, а затем второй раз в разделе «ответ».

$ foo = isset ($ y ++)? $ y ++: 'что-то'; Это не работает. Невозможно использовать isset для результата выражения.

ascsoftw 04.09.2019 14:45

@ascsoftw извините, удален, пока не найду лучший пример

michalhosna 05.09.2019 22:25

Что касается последнего редактирования: количество раз, которое оно оценивается, также зависит от внутренней реализации ?? оператор (неужели один раз?)

Tomek 10.01.2020 11:37

+1 за ссылку на документацию. Время от времени я оказываюсь здесь, потому что оператор должен быть прописан, чтобы Google рассматривал его как поисковый запрос, но все, что мне действительно нужно, это прочитать документацию;)

ksadowski 04.03.2020 15:36

Последнее редактирование не очень четкое / краткое. Мне было трудно читать и понимать это. Нашел то, что проясняет то, что вы хотели там сказать. Так что, пожалуйста, добавьте пример. php.net/manual/en/language.operators.logical.php#115208 $ a = (fruit (1)? Fruit (1): 'apple'); // fruit () будет вызываться дважды!

Valentin 03.04.2020 09:13

Обратите внимание, что, как и в случае с isset(), это также работает с undefined (например, типизированные свойства класса, которые еще не инициализированы).

Michiel Bakker 18.09.2020 11:02

Редактирование действительно ненужное и запутанное. Синтаксис для a??b, a?:b и a?a:b достаточно ясен, так что только последний имеет двойную оценку.

Semra 15.05.2021 17:56

так значит $value = $value ?? null; что-то значит? (Строка из исходного кода API Google Cloud)

AaA 30.08.2021 06:23

@AaA Я рассматриваю случай, когда переменная $value вообще не существовала.

michalhosna 30.08.2021 13:50

Другие вопросы по теме