Menu

Operador de fusión de null en PHP: ?? y ??=

El operador de fusión de null de PHP devuelve su lado izquierdo salvo que sea null o no esté definido: $name = $_GET['name'] ?? 'Guest';. Nunca avisa de una variable o una clave de array que falta. Aprende las cadenas de ??, la asignación ??=, ?? frente a ?: y el operador nullsafe ?->.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

?? devuelve el valor de su izquierda si existe y no es null; si no, el de su derecha: $name = $_GET['name'] ?? 'Guest';. A diferencia de leer la clave directamente, nunca avisa cuando falta la variable o la clave del array.

En la primera ejecución no hay query string, así que se usan los dos valores por defecto. Haz clic en un enlace de la pestaña Página y el script se ejecuta otra vez con $_GET lleno. Leer $_GET["name"] sin ?? en esa primera ejecución imprimiría Warning: Undefined array key "name" en una instalación normal de PHP. Hay más sobre los datos de la petición en la página de GETy_GET y _POST.

?? es una comprobación isset() abreviada

$a ?? $b significa exactamente isset($a) ? $a : $b. Funciona con variables, claves de array a cualquier profundidad y propiedades de objetos, y se detiene en la primera pieza que falta sin quejarse.

La comprobación es la misma que hace isset, así que una clave que existe con el valor null también recibe el valor por defecto.

Encadenar ?? para probar varias fuentes

?? es asociativo por la derecha y puedes encadenar tantos como quieras. PHP devuelve el primer operando que esté definido y no sea null.

??= asigna solo cuando es null

$a ??= $b guarda $b en $a solo cuando $a no está definida o es null. Es la forma más corta de rellenar valores por defecto o de calcular algo una vez y reutilizarlo.

El lado derecho de ??= solo se evalúa cuando ocurre la asignación, y por eso computing 4 aparece una sola vez.

?? vs ?: (ternario corto)

?? comprueba si es null. ?: comprueba si es truthy. Con valores como 0, "" y "0" dan respuestas distintas:

Una cantidad "0" es una entrada real: ?? la conserva, ?: la sustituye. ?: por sí solo avisaría de la clave que falta, y por eso el bloque lo envuelve como ($inputs[$key] ?? null) ?: .... La página del operador ternario explica el propio ?:.

El operador nullsafe ?->

?-> es la versión para objetos de la misma idea, añadida en PHP 8. Si el objeto de la izquierda es null, toda la cadena se detiene y devuelve null en lugar de lanzar un Error como Call to a member function getAddress() on null. Pon ?? al final para un valor por defecto.

El usuario 2 existe pero no tiene dirección, y el usuario 3 no existe en absoluto. Los dos llegan al valor por defecto ?? "unknown" sin ningún error.

Error frecuente: ?? tiene poca precedencia

?? tiene menos prioridad que . y que los operadores aritméticos. Así, en "Count: " . $count ?? 0, PHP construye primero la cadena "Count: " . $count, que nunca es null, y el valor por defecto nunca se usa.

Envuelve la expresión con ?? entre paréntesis siempre que esté dentro de una expresión más grande.

Preguntas frecuentes

¿Qué significa ?? en PHP?

?? es el operador de fusión de null. $a ?? $b devuelve $a si existe y no es null; si no, $b. Es la forma corta de isset($a) ? $a : $b y no genera un warning cuando $a o una clave de array no están definidas.

¿Cuál es la diferencia entre ?? y ?: en PHP?

?? usa el valor por defecto solo cuando el lado izquierdo es null o no está definido, así que 0 ?? 5 es 0 y '' ?? 'x' es ''. ?: lo usa siempre que el lado izquierdo es falsy, así que 0 ?: 5 es 5. Además, ?: avisa de variables y claves no definidas; ??, no.

¿Qué hace ??= en PHP?

$a ??= $b asigna $b a $a solo si $a es null o no está definida; en caso contrario deja $a como estaba. Es la forma corta de $a = $a ?? $b; y se añadió en PHP 7.4.

¿Qué es el operador nullsafe ?-> en PHP?

$obj?->method() llama al método solo cuando $obj no es null; si lo es, toda la cadena devuelve null en lugar de lanzar un error. Combínalo con ?? para un valor por defecto: $user?->getAddress()?->city ?? 'unknown'. Se añadió en PHP 8.0.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR