Elvis vs Null Coalescing: el arma secreta del desarrollador PHP

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Elvis vs Null Coalescing: ¿cuál es la trampa? (Análisis a fondo en PHP)

\n\n

¡Hola, colega! Si alguna vez has programado en PHP, seguro te has topado con la necesidad de verificar si una variable existe y, si es así, usar su valor; si no, asignar uno por defecto. Parece una tarea simple, pero justo aquí es donde muchos (no solo principiantes) se confunden con dos operadores muy similares pero fundamentalmente diferentes: el short-ternary (operador Elvis) ?: y el operador null coalescing ??.

\n\n

Esta es una de las preguntas más populares en Stack Overflow (miles de visitas y votos). Y con razón: la diferencia entre ellos no es solo un interés académico. Elegir mal el operador puede generar errores que te tomarán horas depurar. Aclaremos de una vez por todas cómo funcionan "bajo el capó" y cuándo usar cada uno.

\n\n

Breve introducción: ¿por qué necesitamos estos operadores?

\n\n

Imagina que escribes código para mostrar el nombre de un usuario. Si no hay nombre, mostramos "Invitado". La forma clásica es con if:

\n\n
if (isset($userName)) {\n    $displayName = $userName;\n} else {\n    $displayName = 'Invitado';\n}
\n\n

Funciona, pero es verboso. PHP ofrece atajos elegantes. Y aquí llegamos al dilema principal: ?: o ??? A simple vista parecen lo mismo. Pero solo a simple vista.

\n\n

1. Operador Elvis (?:) — "El rey de los valores booleanos"

\n\n

El operador Elvis (llamado así por su parecido con el peinado del rey del rock and roll: ?: — ojos, nariz y flequillo) apareció en PHP en la versión 5.3. Es una forma abreviada del operador ternario.

\n\n

Sintaxis:

\n
$resultado = $expresion ?: $defecto;
\n\n

¿Qué significa? El intérprete evalúa $expresion. Si se convierte en true (es decir, no es un valor "falso"), devuelve $expresion. Si $expresion es "falso" (false, 0, cadena vacía, null, array vacío, etc.), devuelve $defecto.

\n\n

Detalle importante: El operador Elvis no verifica si la variable existe. Solo verifica su veracidad. Si la variable no está definida, obtendrás un Notice: Undefined index/variable.

\n\n

Ejemplo con trampa:

\n
$contador = 0;\n$resultado = $contador ?: 10;\necho $resultado; // Muestra 10, ¡no 0!
\n\n

¿Por qué? Porque 0 es un valor "falso" (falsy). Elvis considera que la variable está "vacía" y devuelve el valor por defecto. Para muchos, esto es una sorpresa.

\n\n

2. Operador Null Coalescing (??) — "El salvador de los Notice"

\n\n

El operador null coalescing llegó con PHP 7.0 y fue recibido con entusiasmo. Su superpoder principal es que trabaja de forma segura con variables inexistentes sin generar errores.

\n\n

Sintaxis:

\n
$resultado = $expresion ?? $defecto;
\n\n

¿Qué significa? El operador verifica si $expresion existe y no es null. Si es así, devuelve $expresion. De lo contrario, devuelve $defecto.

\n\n

Diferencia clave: ?? ignora todos los valores "falsos" excepto null y la indefinición (undefined). 0, "", false — todos se consideran valores válidos y se devuelven.

\n\n

Ejemplo:

\n
$contador = 0;\n$resultado = $contador ?? 10;\necho $resultado; // ¡Muestra 0! Porque la variable existe y no es null.
\n\n

¿Ves la diferencia? Ese es el mecanismo principal "bajo el capó".

\n\n

3. Comparación "bajo el capó": tabla de verdad

\n\n

Resumamos todo en una tabla visual para fijar conceptos. Supongamos que

Blogs

Book Recommendations