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

Resuelto elkolotfi asked hace 54 años • 3 respuestas

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.

elkolotfi avatar Jan 01 '70 08:01 elkolotfi
Aceptado

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".

michalhosna avatar Dec 04 '2018 10:12 michalhosna
$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
Cid avatar Dec 04 '2018 10:12 Cid
$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

Prodigle avatar Dec 04 '2018 10:12 Prodigle