¿Qué significa el operador de signo de interrogación doble(??) en PHP




operator-keyword symfony4 (2)

Es el "operador de unión nula", agregado en PHP 7.0. La definición de cómo funciona es:

Devuelve su primer operando si existe y no es NULL; De lo contrario, devuelve su segundo operando.

Así que en realidad es solo isset() en un operador práctico.

Esos dos son equivalentes:

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

Documentación: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce

En la lista de nuevas características de PHP7: http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

Y original RFC https://wiki.php.net/rfc/isset_ternary

Esta pregunta ya tiene una respuesta aquí:

Me sumergí en el código de Symfony framework (versión 4) y encontré esta tranquilidad de código:

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

No estoy muy seguro de lo que realmente hace esto, pero me imagino que se expande a algo como:

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

O tal vez:

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

¿Alguien tiene alguna precisión sobre el tema?

EDITAR:

A todas las personas que respondieron la pregunta: gracias a todas las personas que marcaron mi pregunta como negativa porque ya hay una pregunta similar ( operador ternario de PHP frente a operador de fusión nula ):

Es cierto que ambas preguntas son muy similares. Sin embargo, es difícil para todos imaginar que el "??" Se llama el operador coalescente.

De lo contrario, podría encontrarlo fácilmente en la documentación oficial:

http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

Sin embargo, para alguien que no sabía que esta característica se agregó en php 7 es más probable que escriba:

"php ?? operator" o "php double question mark operator"

Y aquí es por qué mi pregunta tiene un valor añadido.

Les pido que, por favor, reconsideren sus comentarios negativos. Gracias

Saludos, Epixilog


$myVar = $someVar ?? 42;

Es equivalente a :

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

Para constantes, el comportamiento es el mismo cuando se usa una constante que ya existe :

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

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

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

Sin embargo, para las constantes que no existen, esto es diferente:

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

Advertencia : Uso de la constante indefinida IDONTEXIST - asumida como 'IDONTEXIST' (esto generará un error en una versión futura de PHP)

Php convertirá la constante no existente en una cadena.

Puede usar la constant("ConstantName") que devuelve el valor de la constante o nulo si la constante no existe, pero aún generará una advertencia. Puede añadir la función con el operador de control de errores @ para ignorar el mensaje de advertencia:

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




symfony4