Nell’ultima major release di PHP, la 7.0, è stato introdotto un nuovo interessante e altrettanto utile operatore: spaceship. Questo operatore prende il nome dalla sua forma <=> che, con un po’ di fantasia, ricorda quella di una navicella spaziale.

Che cosa fa l’operatore spaceship?

Beh, è molto semplice: spaceship confronta due valori. Se il primo valore è maggiore del secondo restituisce un intero positivo 1;  se il primo valore è minore del secondo restituisce un intero negativo -1; infine se i due valori sono uguali restituisce 0.

Vediamo alcuni esempi di utilizzo di spaceship, comparando diversi tipi di dato, come interi, decimali, stringhe, array e oggetti.

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
 
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
 
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
 
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
 
// Objects
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0
 
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "c"]; 
echo $a <=> $b; // -1
 
$a = (object) ["a" => "c"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 1
 
$a = (object) ["a" => "b"]; 
$b = (object) ["b" => "b"]; 
echo $a <=> $b; // 0

Quando viene utile l’operatore spaceship? Senz’altro durante l’operazione di ordinamento di un array. Prendiamo ad esempio la funzione usort() di PHP.

bool usort ( array &$array , callable $value_compare_func )

La funzione usort ordina gli elementi di un array mediante il confronto di ogni elemento dell’array con gli altri. Il confronto viene effettuato da una funzione che deve essere specificata come argomento.

Come vedete, usort non restituisce l’array ordinato, ma un booleano che indica il successo o meno dell’operazione. L’array viene specificato come reference, ciò significa che il valore della variabile array passata come argomento verrà modificato.

Vediamo invece dalla documentazione del manuale di PHP come viene descritta la funzione di confronto:

La funzione di comparazione deve restituire un numero intero minore, uguale o maggiore di zero se il primo argomento è rispettivamente minore, uguale o maggiore del secondo.

Esattamente quello che l’operatore spaceship restituisce!

Perfetto, vediamo quindi un esempio pratico di utilizzo della funzione usort con una funzione di confronto che utilizza l’operatore spaceship. E’ molto semplice:

usort($asc, function (int $a, int $b) { 
    return ($a <=> $b); 
});

Nota che in questo caso abbiamo anche utilizzato la nuova funzionalità di PHP 7 per definire $a e $b come interi. In questo esempio si presuppone che $asc sia un array di numeri interi, ma come abbiamo visto è possibile confrontare anche gli altri tipi di dato.

Senza l’operatore spaceship la stessa funzione avrebbe richiesto qualche riga di codice in più:

usort($asc, function($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});

Quindi se state usando una versione di PHP meno recente della 7.0, questo secondo esempio è l’unica opzione.

Corsi LaraMind: PHP, JavaScript, Laravel e Vue.js