El operador de fusión nula en PHP 7

Trabajar con variables en PHP es bastante fácil. La declaración e inicialización de variables se realiza mediante una única expresión. Por ejemplo, la expresión $user [‘name’] = ‘John’; declarará automáticamente la variable $user de tipo array e inicializará ese array con un solo nombre clave de valor John.

El desarrollo diario a menudo incluye verificar la existencia de un valor variable para varias decisiones de ramificación, como if ($user [‘name’] == ‘John’) {…} else {…}. A medida que escribimos nuestro código nosotros mismos, tendemos a asegurarnos de que nuestro código no use variables no declaradas y claves de matriz no inicializadas. Sin embargo, hay casos en los que las variables provienen del exterior, por lo que no estamos realmente en condiciones de garantizar su existencia en tiempo de ejecución.

Llamar a $user [‘nombre’] cuando $ user no está configurado, o está configurado pero con teclas distintas al nombre, dará como resultado un nombre de índice indefinido. Al igual que cualquier estado inesperado en el código, los avisos son malos, más aún porque en realidad no rompen su código, permiten que se ejecute más.

Cuando se produce un aviso, a menos que tengamos la configuración de visualización display_errors establecida en verdadero y los informes de errores configurados para mostrar E_ALL, ni siquiera veríamos el aviso en el navegador.

Esto es malo, ya que podríamos depender de la existencia de variables y sus valores que no están allí. Es posible que esta dependencia ni siquiera se maneje en nuestro código, y ni siquiera nos daríamos cuenta porque el código continuará ejecutándose a menos que se ingrese una verificación de variable específica en el lugar.

El lenguaje PHP tiene un cierto número de variables predefinidas llamadas superglobales, que podemos usar desde cualquier función, clase o archivo, independientemente del alcance. Los más utilizados son probablemente las superglobales $ _POST y $ _GET, que se utilizan para obtener los datos enviados a través de formularios o parámetros de URL. Como no podemos garantizar la existencia de $ _GET [‘nombre’] en tales casos, debemos verificarlo. Por lo general, esto se hace usando las funciones isset y empty en PHP, como se muestra en el siguiente bloque de código:

// #1
if (isset($_GET['name']) && !empty($_GET['name']))
{
$name = $_GET['name'];
} else {
$name = 'N/A';
}
// #2
if (!empty($_GET['name']))
{
$name = $_GET['name'];
} else {
$name = 'N/A';
}
// #3
$name = ((isset($_GET['name']) && !empty($_GET['name']))) ? $_GET['name'] :'N/A';
// #4
$name = (!empty($_GET['name'])) ? $_GET['name'] : 'N/A';

El primer ejemplo es el más robusto, ya que utiliza las funciones isset y empty. Estas funciones no son las mismas, por lo que es importante comprender qué hace cada una de ellas. Lo bueno de una función vacía es que no activará un aviso si intentamos pasarla una variable que podría no establecerse, como $ _GET [‘nombre’]; simplemente devolverá verdadero o falso. Esto hace que la función vacía sea un buen ayudante para la mayoría de los casos. Sin embargo, incluso el cuarto ejemplo, escrito a través del uso del operador ternario, es algo robusto.

PHP 7 introdujo un nuevo tipo de operador llamado operador de fusión nula (??). Nos da la capacidad de escribir expresiones más cortas. El siguiente ejemplo demuestra la elegancia de su uso:

$ nombre = $ _GET ['nombre'] ?? 'N / A';

Devuelve el resultado de su primer operando si existe y no es nulo, o si no su segundo operando. En otras palabras, al leerlo de izquierda a derecha, el primer valor existente, que no es nulo, es el valor que se devolverá.

Comparte