> Manuales > Manual de PHP

Aprende a usar el operador ??, null coalescing operator, disponible en PHP para verificar la existencia de una variable, asignando un valor predeterminado en caso de que no exista la variable o sea null.

Operador ?? de PHP, coalescencia nula

En este artículo vamos a introducir un "nuevo" operador de PHP. Fue introducido en la versión 7.0, ya hace bastantes años aunque todavía no es tan popular entre los desarrolladores. viene bien aprenderlo porque así podrás utilizarlo para simplificar tu código.

Qué es el operador de coalescencia nula

El operador que vamos a ver en ese artículo se llama "null coalescing operator" en inglés. Este término se traduciría de manera literal como "operador de coalescencia nula". Con toda certeza el nombre no te dice demasiado, así que vamos a explicarlo.

En muchas ocasiones necesitamos asignar valores a variables, tomando como predeterminado un valor en concreto. Vamos a dar un par de ejemplos:

Para todo esto podemos utilizar el operador de coalescencia nula, (??). Este operador te permite asignar un valor predeterminado en caso de que una variable no esté definida o su valor sea null.

Cómo se trabajaba en PHP antes de la llegada del operador ??

Antes de la introducción del operador de coalescencia nula (??) en PHP 7, los desarrolladores generalmente usaban combinaciones de la función isset() junto con el operador ternario, o un condicional if tradicional, para asignar valores predeterminados a las variables que podrían no estar definidas o que podrían ser null.

A continuación puedes ver un ejemplo de cómo se solía proceder anteriormente en este tipo de situaciones:

// Supongamos que estamos intentando obtener un valor de un array que puede no existir
$start_time = isset($_POST["start_time"]) ? $_POST["start_time"] :  date("Y-m-d H:i:s");

// También podríamos hacer algo similar con la propiedad de un objeto
$start_time = isset($request->start_time) ? $request->start_time :  date("Y-m-d H:i:s");

// Incliso se podría manejar múltiples niveles de verificación
$start_time = isset($request->start_time) ? $request->start_time : (isset($default_time) ? $default_time : 'otro valor...');

En estos ejemplos, isset() se usa para verificar si la variable está definida y no es null. Si isset() devuelve true, se utiliza el valor de la variable. En caso contrario, se asigna un valor predeterminado. Esto requería escribir más código y podía ser menos claro, especialmente cuando se necesitaban múltiples verificaciones.

Cómo funciona null coalescing operator ??

Con la introducción del operador ??, este mismo código se puede simplificar significativamente, aportando claridad al código.

$start_time = $_GET['start_time'] ?? date("Y-m-d H:i:s");

Esto hace que el código sea más claro y compacto. La mejora ya resulta significativa cuando queremos verificar que una variable o propiedad existe, pero es todavía mas útil en situaciones donde se deben manejar múltiples variables opcionales.

Aparte de escribir menos código y ser más legible, también aporta la ventaja de evitar advertencias de PHP (warnings) cuando se intenta acceder a variables que podrían no estar definidas. Por eso se usa mucho para manejar valores opcionales o faltantes en aplicaciones PHP modernas.

Ejemplo de verificación de varias variables en cadena

Ahora vamos a ver un un ejemplo práctico y donde podríamos necesitar verificar varias variables hasta asignar un valor predeterminado, usando PHP. Esto lo podríamos necesitar en la configuración de una aplicación, donde diferentes niveles de configuración podrían sobrescribir los valores predeterminados.

Imagina que necesitas establecer un tema de color para la interfaz de usuario de una aplicación web, basándote en la configuración del usuario, la configuración del sistema, o un valor predeterminado si ninguno de los anteriores está disponible.

Antes de PHP 7, podrías haber escrito algo como esto:

// Supongamos que estas variables vienen de diferentes fuentes, como una base de datos, archivo de configuración, o entrada del usuario
$userTheme = isset($userPreferences['theme']) ? $userPreferences['theme'] : null;
$systemTheme = isset($systemSettings['theme']) ? $systemSettings['theme'] : null;
$defaultTheme = 'light';  

// Elegir el tema basado en la disponibilidad
$theme = isset($userTheme) ? $userTheme : (isset($systemTheme) ? $systemTheme : $defaultTheme);

Este código verifica primero si hay un tema definido en las preferencias del usuario; si no lo hay, verifica las configuraciones del sistema; y si tampoco se encuentra allí, entonces asigna un valor predeterminado. Aunque funcional, este código es un poco engorroso y difícil de leer.

Con el operador de coalescencia nula en PHP 7 o superior, el mismo código se podría escribir de la siguiente manera:

// Las variables podrían venir de fuentes como una base de datos, archivo de configuración, o entrada del usuario
$userTheme = $userPreferences['theme'] ?? null;
$systemTheme = $systemSettings['theme'] ?? null;
$defaultTheme = 'light';  // Un tema predeterminado si no se encuentra nada más

// Elegir el tema basado en la disponibilidad
$theme = $userTheme ?? $systemTheme ?? $defaultTheme;

En este caso, el operador ?? se encadena para revisar las variables en orden, de izquierda a derecha. Primero userTheme, luego systemTheme, y finalmente defaultTheme.

Como puedes apreciar, este código es mucho más limpio y fácil de entender, lo que mejora la mantenibilidad del código.

Y eso es todo. Se trata de un operador muy sencillo de usar que te puede venir bien en muchas ocasiones. Espero que lo puedas practicar en adelante en tus propias aplicaciones.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual