Operador ternario: ¿cómo?

El otro día en el curso PHP guay programamos esta clase traductora sencilla con arrays. Dimos un paso importante en dificultad y dijimos que comentaríamos los aspectos PHP involucrados en ese código.



Si hace poco que programas seguro que esta sentencia de código te parece un poco extraña:

$a ? $b : $c;

Pero no tiene ningún secreto, es fácil de entender: ¡es el operador ternario! Está disponible en muchos lenguajes de programación.

En lenguaje natural podemos traducirlo así:

Si $a es cierto se evalúa $b; si no, entonces se evalúa $c.

Este operador condicional es un atajo (shortcut, en inglés) que equivale a:

if($a)
{
    $b;
}
else
{
    $c;
}

Para que el operador condicional ternario funcione tienen que darse estas condiciones:

  1. $a es una expresión booleana
  2. $b es una expresión
  3. $c es una expresión

Recuerda que una expresión es cualquier combinación válida de constantes, variables, funciones (funciones que devuelven valores) y operadores. Y que, por lo tanto, una expresión booleana es una expresión que devuelve un valor booleano (cierto o falso).

Ternario significa “Compuesto de tres elementos”, de modo que cuando vayamos a utilizar este operador debemos escribir las tres expresiones que lo componen. A partir de PHP 5.3 hay una variante del operador ternario que permite escribir solo dos expresiones, pero en este post no vamos a ver ese uso.

Este script PHP CLI contiene algunos ejemplos de uso del operador ternario:

#!/bin/php
<?php

// Ternary operator example 1
7 > 5 ? $b = 'Hello world' : $c = 'I won\'t be set';

// Print value
if(isset($b)) echo "The value of $b is $b." . PHP_EOL;
if(isset($c)) echo "The value of $c is $c." . PHP_EOL;

// Reset vars
$b = null;
$c = null;

// Ternary operator example 2
7 < 100 && false ? $b = (7 + 8) / 3 : $c = true or false;

// Print value
if(isset($b)) echo "The value of $b is $b." . PHP_EOL;
if(isset($c)) echo "The value of $c is $c." . PHP_EOL;

// Reset vars
$b = null;
$c = null;

// Ternary operator example 3
$days = 366;
$isLeapYear = ($days === 366) ? true : false;

// Print value
if($isLeapYear) 
{
    echo 'This is a leap year.' . PHP_EOL;
}
else
{
    echo 'This is not a leap year.' . PHP_EOL;
}

El ejemplo de arriba está disponible en el repositorio GitHub del curso PHP guay.