Desarrollo

El operador ternario

Desarrollo PHP

Esta breve entrada se va a centrar en el operador ternario. Este operador se define como una contracción de una estructura de control IF-ELSE que se escribe en una sola línea. Proporciona una solución elegante y legible cuando la estructura IF-ELSE es corta, sencilla y, en ocasiones, mejor expresada en una línea.

Lo que hacíamos hasta ahora

Imaginemos que el usuario rellena un formulario y puede seleccionar una acción para realizar que se enviaría en la variable $_POST[‘accion’]. Tenemos una variable $accion donde guardaremos la acción que un usuario ha indicado que se debe hacer o, si no ha indicado nada, entonces nos guardamos la acción por defecto. Tendríamos, para su comprobación, una estructura parecida a esta. Sería simple:

<?php
if (empty($_POST['accion'])) {
    $accion = 'default';
} else {
    $accion = $_POST['accion'];
}
?>

Es decir, si el usuario ha indicado la acción a realizar, nos guardamos cuál ha sido. Sin embargo, si no lo ha indicado y está vacía, hacemos la acción por defecto.

Lo que podemos hacer con el operador ternario

El operador ternario viene al rescate para realizar todo lo que hemos hecho arriba en una sola línea, evitando así esos bloques de IF-ELSE tan sencillos. Vamos a verlo y luego lo comentamos:

<?php
$accion = (empty($_POST['accion'])) ? 'default' : $_POST['accion'];
?>

El operador ternario con dos opciones

El código anterior se puede dividir en tres partes. En una primera parte, si nos fijamos, tenemos la condición que le habíamos puesto al IF pero, en esta ocasión, sin ver el texto if por ningún lado. Esa condición, como ya podemos suponer, nos va a devolver true o false dependiendo de si se cumple (en este ejemplo se cumplirá cuando esté vacío) o no.

Luego tenemos el símbolo ?, el cual se utiliza para que, a continuación, vengan las dos partes del IF-ELSE. Lo que vendrá a continuación será el código que devolverá la opción cierta. Es decir, en este ejemplo tendríamos que si $_POST[‘accion’] está vacío, entonces devuelve ‘default’ y, como tenemos una asignación al principio, le estaríamos asignando ‘default’ a la variable $accion.

Esta estructura, así sin más, no funciona, pues debemos indicarle algo más en la condición del ELSE. Para ello, se utilizan los dos puntos : para dividir las partes entre lo que se hace si la condición se cumple y lo que se hace cuando no. En este ejemplo, cuando no se cumple la condición, devolvemos $_POST[‘accion’] pues ya sabremos que no está vacía. Así, $accion cogerá su valor.

En una sola línea hemos expresado toda la estructura IF-ELSE anterior.

El operador ternario con una opción

No podemos prescindir de la parte del ELSE, pero sí hay casos en los que podremos prescindir de la parte en la que la condición se cumple, lo que hará que se devuelva la propia condición. Por ejemplo, adaptemos un poco el ejemplo anterior. En nuestro formulario, aunque el usuario no rellene el campo ‘accion’, tendremos la variable $_POST[‘accion’] definida pero con la cadena vacía como su valor. Esto hará que el ejemplo anterior funcione igual, pues la función empty devolverá false con la cadena vacía.

Sin embargo, sabiendo esto podemos redefinir el operador ternario y hacer que sólo utilice la opción del ELSE, mientras que la otra opción será el valor de la propia condición. Podemos jugar con el hecho de que, como vimos en la transformación de datos, cualquier valor que no sea 0, la cadena vacía, etc., se considerará true. Así, esto funcionaría:

<?php
$accion = ($_POST['accion']) ?: 'default';
?>

Leamos bien qué sucede. En primer lugar ahora hemos prescindido del empty en la condición. Sabemos que $_POST[‘accion’] va a devolver true si no es la cadena vacía, es decir, si el usuario ha escrito algo en el <input> con nombre accion. A continuación, hemos contraído ahora el operador ternario y se muestra con el doble símbolo ?: que, como podemos apreciar, lo que hace es prescindir de la primera parte que teníamos antes.

¿Y qué va a guardarse en $accion? Pues, en el caso en que $_POST[‘accion’] no esté vacío, en $accion se va a guardar su propio valor. En otras palabras, si la condición es cierta se va a devolver de esta forma el valor de la propia condición. Si $_POST[‘accion’] tuviera el string ‘crear’, por ejemplo, sería este valor el que acabaría asignado a $accion. Y, si estuviera vacío, entonces se cogería el valor que hemos indicado en la última parte del operador ternario, el valor del ELSE digamos, y contendría entonces ‘default’.

Algunos ejemplos

Aparte de para ahorrarnos líneas de código, este operador nos puede venir bien en, por ejemplo, estas situaciones:

<form action="accion.php">
    <input type="text" name="nombre" value="<?php echo (isset($_POST['nombre'])) ? $_POST['nombre'] : ''; ?>">

    <select name="accion">
        <option value="crear" <?php echo (isset($_POST['accion']) && $_POST['accion'] === 'crear') ? 'selected' : ''; ?>>Crear</option>
        <option value="modificar" <?php echo (isset($_POST['accion']) && $_POST['accion'] === 'modificar') ? 'selected' : ''; ?>>Modificar</option>
    </select>

    <input type="submit" value="Enviar">
</form>

Imaginemos, en el primer caso, que tenemos un <input> de tipo texto con el nombre y un <select> con un par de acciones. Por lo que sea (porque el formulario tiene más campos o que el nombre tiene una restricción de longitud, o lo que sea), enviamos el formulario, lo validamos y hay algún dato incorrecto, por lo que volvemos a solicitarlo. Pero queremos que los datos que ha introducido el usuario vuelvan a aparecer en esta recarga del formulario.

Ahí jugamos con la variable $_POST y si existe alguno de los campos. En el caso del <input> podríamos hacer lo siguiente sin utilizar el operador ternario:

<?php
if (isset($_POST['nombre'])) {
    $nombre = $_POST['nombre'];
} else {
    $nombre = '';
}
<input type="text" name="nombre" value="<?php echo $nombre; ?>">
?>

Sin embargo, gracias al operador ternario lo hemos introducido todo en una línea, sin necesidad de variables auxiliares, mucho más compacto y puede que más entendible.

Con el <select> hemos hecho lo mismo. Es decir, en cada opción del <select> hemos comprobado si esa opción era la que el usuario había seleccionado primero comprobando que existía la variable $_POST[‘accion’] (porque si no existe, dará error de variable no definida) y, sabiendo que existe, comprobando si la acción es igual a la de esa opción. En el caso de que lo sea, se imprime (fijáos que hemos puesto el echo antes de todo) ‘selected’ y, si no es así, pues se imprimiría una cadena vacía, es decir, nada.

Hemos evitado hacer las comprobaciones previamente en varias líneas para guardarnos en una variable auxiliar el dato y luego introducirlo. Sin embargo, es cierto que el operador ternario suele ser algo complicado a mucha gente que está empezando a programar, pero en cuanto se le pilla el truco, es muy accesible para crear este tipo de construcciones.

Cosas con las que tener cuidado

Se pueden anidar operadores ternarios, pero no lo aconsejamos. ¿Por qué? Porque es difícil de leer y de saber qué va a mostrar. Por ejemplo, ¿qué imprime por pantalla el siguiente ejemplo?:

<?php
echo (true ? '1' : false ? '2' : '3');
?>

A primera vista podríamos pensar que, como la condición es directamente true, entonces imprimirá ‘1’, sin embargo si lo ejecutamos vemos que se imprime por pantalla ‘2’. Esto es así porque el operador ternario se evalúa de izquierda a derecha, y en este caso evaluará ambos. Lo que realmente está haciendo es esto:

<?php
echo ((true ? '1' : false) ? '2' : '3');
?>

Es decir, primero evalúa (true ? ‘1’ : false) lo que devolverá un ‘1’ y, como esta cadena va a ser true, entonces el segundo operador ternario se evaluará como cierto y, finalmente, imprimirá un ‘2’ por pantalla. Es lioso a nuestros ojos, por lo que se aconseja no anidar operadores ternarios si no se quieren obtener resultados extraños o si no se sabe muy bien lo que se está construyendo.

Resumen

El operador ternario es una rareza cuando empezamos a leer código de otros, porque no es algo que se enseñe muy al principio y nos provoca una mueca de no saber qué está ocurriendo en ese trozo de código. Sin embargo, una vez conocido y cogido el truco, nos puede ayudar muchas veces para expresar rápidamente nuestro código y para introducirlo dentro de archivos HTML.

Ahora sí, después de unos artículos donde hemos ampliado conocimientos con herramientas y construcciones útiles, podemos pasar a practicar con ellas y, posteriormente, a comenzar con el bloque de trabajar con archivos.

Deja una respuesta