Что означает оператор двойного знака вопроса (??) в 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';
У кого-то есть точная информация о предмете?
EDIT:
Всем, кто ответил на вопрос: спасибо
Всем людям, которые отметили мой вопрос как отрицательный, потому что там уже был похожий вопрос (троичный оператор PHP против оператора объединения нулей):
Это правда, что оба вопроса очень похожи. Однако всем трудно представить, что "??" называется оператором объединения.
В противном случае я мог бы легко найти это в официальной документации:
http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
Тем не менее, для тех, кто не знал, что эта функция была добавлена в php 7, она может набрать:
"оператор php??" или "оператор двойного знака вопроса php"
И вот почему мой вопрос имеет дополнительную ценность.
Прошу, пожалуйста, пересмотреть ваш отрицательный отзыв.
Благодаря
С Уважением,
Epixilog
Ответы
Ответ 1
Это "нулевой оператор слияния", добавленный в php 7.0. Вот как это работает:
Возвращает свой первый операнд, если он существует и не равен NULL; в противном случае возвращается второй операнд.
Так что на самом деле это просто 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 Существует различие: в случае ??
первое выражение оценивается только один раз, в отличие от ? :
, где выражение сначала оценивается в разделе условий, а затем во второй раз в "ответе". раздел.
Ответ 2
$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
Предупреждение: использование неопределенной константы IDONTEXIST - предполагается, что IDONTEXIST (это приведет к ошибке в будущей версии PHP)
Php преобразует несуществующую константу в строку.
Вы можете использовать constant("ConstantName")
которая возвращает значение константы или ноль, если константа не существует, но она все равно вызовет предупреждение. Вы можете добавить функцию к оператору контроля ошибок @
чтобы игнорировать предупреждающее сообщение:
$myVar = @constant("IDONTEXIST") ?? "42"; // No warning displayed anymore
echo $myVar . PHP_EOL; // 42
Ответ 3
$x = $y ?? 'dev'
является короткой рукой для x = y, если y задано, иначе x = 'dev'
Существует также
$x = $y =="SOMETHING" ? 10 : 20
означает, что если y равно "ЧТО-ТО", то x = 10, в противном случае x = 20