¿Qué significa el operador de doble signo de interrogación (??) en PHP [duplicado]
Estaba sumergiéndome en el código del marco Symfony (versión 4) y encontré este fragmento de código:
$env = $_SERVER['APP_ENV'] ?? 'dev';
No estoy seguro de qué hace esto realmente, pero 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?
Nota: la principal diferencia entre mi pregunta y esta pregunta es que la mayoría de las personas (como yo antes) ignoran que el doble signo de interrogación se llama operador coalescente nulo. Por tanto, esta pregunta es más relevante y accesible para los principiantes.
Es el "operador coalescente nulo", 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 sólo isset()
un operador práctico.
Esos dos son equivalentes 1 :
$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 RFC original https://wiki.php.net/rfc/isset_ternary
EDITAR : Como esta respuesta recibe muchas visitas, una pequeña aclaración:
1 Hay una diferencia: en el caso de ??
, la primera expresión se evalúa solo una vez, a diferencia de ? :
, donde la expresión se evalúa primero en la sección de condición y luego la segunda vez en la sección "respuesta".
$myVar = $someVar ?? 42;
Es equivalente a :
$myVar = isset($someVar) ? $someVar : 42;
Para las constantes, el comportamiento es el mismo cuando se utiliza 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 IDONTEXIST no definida: se asume 'IDONTEXIST' (esto arrojará un error en una versión futura de PHP)
PHP convertirá la constante inexistente en una cadena.
Puede usar constant("ConstantName")
que devuelva el valor de la constante o nulo si la constante no existe, pero aún así generará una advertencia. Puede anteponer a la función 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
$x = $y ?? 'dev'
es una abreviatura de x = y si se establece y; de lo contrario, x = 'dev'
También hay
$x = $y =="SOMETHING" ? 10 : 20
es decir, si y es igual a 'ALGO' entonces x = 10, de lo contrario x = 20