El operador spaceship en PHP 7

Comparar dos valores es una operación frecuente en cualquier lenguaje de programación. Utilizamos varios operadores de lenguaje para expresar el tipo de comparación que deseamos ejecutar entre dos variables. En PHP, estos operadores incluyen igual ($a==$b), idéntico ($a===$b), no igual ($a!= $b o $a<>$b), no idéntico ($a ! == $b), menor que ($a<$b), mayor que ($a>$b), menor o igual que ($a<= $b), y mayor o igual que ($a>=$b) comparaciones.

Todos estos operadores de comparación dan como resultado booleanos verdadero o falso. A veces, sin embargo, hay casos en los que se necesita una comparación tripartita, en cuyo caso, el resultado de la comparación es más que un verdadero booleano verdadero o falso. Si bien podemos lograr una triple comparación utilizando varios operadores a través de diversas expresiones, la solución es casi elegante.

Con el lanzamiento de PHP 7, se introdujo un nuevo operador spaceship <=>, con una sintaxis como la siguiente:

(expr) <=> (expr)

El operador spaceship <=> ofrece una comparación combinada. Después de la comparación, sigue estas condiciones:

  • Devuelve 0 si ambos operandos son iguales
  • Devuelve 1 si el operando izquierdo es mayor
  • Devuelve -1 si el operando correcto es mayor

Las reglas de comparación utilizadas para obtener los resultados anteriores son las mismas que las utilizadas por los operadores de comparación existentes: <, <=, ==,> = y>.

La utilidad del nuevo operador es especialmente evidente con las funciones de pedido. Sin él, las funciones de pedido eran bastante robustas, según el siguiente ejemplo:

$users = ['branko', 'ivana', 'luka', 'ivano'];
usort($users, function ($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
});

Podemos acortar el ejemplo anterior al aplicarle el nuevo operador, de la siguiente manera:

$users = ['branko', 'ivana', 'luka', 'ivano'];
usort($users, function ($a, $b) {
return $a <=> $b;
});

La aplicación del operador spaceship <=>, cuando corresponda, da simplicidad a las expresiones y elegancia.

Comparte