Menu

Operador ternario en PHP: ?: abreviado y ternario anidado

El operador ternario de PHP es un if/else en una línea: $result = $condition ? 'yes' : 'no';. Aprende el ternario corto ?: (operador Elvis), en qué se diferencia de ??, por qué los ternarios anidados necesitan paréntesis desde PHP 8 y cuándo match es la opción más limpia.

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

El operador ternario es un if/else que cabe en una expresión: condition ? valueIfTrue : valueIfFalse. Devuelve uno de los dos valores, así que puedes asignarlo, imprimirlo con echo o pasarlo a una función.

Cambia $age a 15 y $items a 3 y vuelve a ejecutarlo. Fíjate en los paréntesis alrededor del ternario en la última línea: sin ellos, el . uniría primero las cadenas y el resultado no sería el que quieres.

Ternario en plantillas HTML

Un ternario es la forma habitual de elegir una clase CSS, una etiqueta o un atributo dentro de una plantilla. Este bloque lee ?stock= de la URL: ejecútalo, haz clic en los enlaces de la pestaña Página y el mismo script se ejecuta otra vez con otro valor.

<?= ... ?> es la forma corta de <?php echo ... ?>, y mantiene legibles las condiciones de una línea dentro del marcado.

Ternario corto ?: (el operador Elvis)

Si omites la parte central obtienes $a ?: $b: devuelve $a cuando $a es truthy y, si no, $b. Es práctico para valores por defecto cuando una cadena vacía o un 0 también deben sustituirse.

Los valores falsy son false, 0, 0.0, "", "0", [] y null. Si "0" es una respuesta real en tus datos (un campo de cantidad, un PIN), el ternario corto la descartará.

?: vs ??

Se parecen, pero comprueban cosas distintas. ?: usa el valor por defecto cuando el lado izquierdo es falsy. ?? lo usa solo cuando el lado izquierdo es null o no está definido, y no avisa de una variable o una clave de array que falta.

Usa ?? para "puede que el valor no exista" (datos de la petición, arrays de configuración, claves opcionales). Usa ?: para "el valor existe pero puede estar vacío". La página del operador de fusión de null explica ?? y ??= en detalle.

El ternario anidado necesita paréntesis

PHP 7 leía a ? b : c ? d : e de izquierda a derecha, al contrario que casi todos los demás lenguajes, y daba resultados incorrectos. PHP 8 se niega a adivinar:

<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2

Añade paréntesis alrededor del ternario interior y funciona:

El ternario corto es la excepción: $a ?: $b ?: $c se permite sin paréntesis, como en el ejemplo de Elvis de arriba.

Usa match(true) cuando haya más de dos ramas

Un ternario anidado de tres o cuatro niveles cuesta de leer incluso con paréntesis. match con true como sujeto comprueba las condiciones de arriba abajo y devuelve la primera rama que coincide:

Deja el ternario para dos resultados en una línea, y pasa a match o a una cadena if/elseif en cuanto necesites un tercero.

Preguntas frecuentes

¿Qué es el operador ternario en PHP?

Una forma corta de if/else que devuelve un valor: $label = $age >= 18 ? 'adult' : 'minor';. Si la condición antes de ? es verdadera, se usa la expresión después de ?; si no, la que va después de :.

¿Qué significa ?: en PHP?

$a ?: $b es el ternario corto (también llamado operador Elvis). Devuelve $a si $a es truthy y $b en caso contrario, así que '' ?: 'default' es 'default'. Es lo mismo que $a ? $a : $b, pero $a se evalúa una sola vez.

¿Se pueden anidar operadores ternarios en PHP?

Solo con paréntesis. Desde PHP 8, $a ? 'x' : $b ? 'y' : 'z' es un error fatal, así que escribe $a ? 'x' : ($b ? 'y' : 'z'). Para más de dos ramas, match(true) o una cadena if/elseif se leen mejor.

¿Puedo usar un ternario sin la parte del else?

No, el ternario siempre necesita las dos ramas. Para "usa este valor o uno por defecto" escribe $x ?: 'default' o $x ?? 'default'; para hacer algo solo cuando se cumple una condición, escribe un if normal o $condition && doSomething();.

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

Aprende a programar con Coddy

COMENZAR