¿Qué significa el operador de signo de interrogación doble(??) en PHP
operator-keyword symfony4 (3)
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í:
- Operador ternario de PHP vs operador coalescente nulo 12 respuestas
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
$x = $y ?? ''dev''
es una mano corta para x = y si y se establece, 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