PHP

Operador de comparação combinada no PHP 7 (Spaceship)

Por em

Vamos aprender neste artigo, como utilizar o novo operador de comparação combinada introduzido no PHP 7 (mais conhecido como spaceship), similar as funções strcmp() e version_compare(), porém podendo ser utilizado com qualquer valor do PHP.

Veja abaixo a sintaxe do operador:

(exp) <=> (exp)

Onde (exp) é substituído por valores que serão usados na comparação, vejamos abaixo um exemplo real:

<?php

var_dump(1 <=> 2); // int(-1)

Muito bom! Mas porque a comparação acima retornou um -1? Muito simples, a lógica do resultado é a seguinte:

  • Se ambas expressões forem igual, então retorna 0;
  • Se a expressão da esquerda for maior, então retorna 1;
  • Se a expressão da direita for maior, então retorna -1;

Para compreendermos melhor, vamos aplicar isso no código, vejam os exemplos abaixo:

<?php

// int
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
 
// float
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// string
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
 
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
 
// array
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
 
// object
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0

Vamos avançar um pouco mais e criar uma função para comparar dois números, porém queremos que a função não apenas compare se é maior, mas também compare se são iguais, ou menor. Anteriormente ao PHP 7 utilizávamos o operador ternário, como o exemplo abaixo:

<?php
// before PHP7
function intCompare(int $n1, int $n2) : int {
    return ($n1 < $n2) ? -1 : (($n1 > $n2) ? 1 : 0);
}

var_dump(intCompare(1, 2)); // int(-1)

Com o novo operador do PHP 7, podemos fazer algo do tipo:

<?php
// with PHP7
function intCompare(int $n1, int $n2) : int {
    return $n1 <=> $n2;
}

var_dump(intCompare(1, 2)); // int(-1)

Percebam que com o uso deste operador nossa função fica mais “clean”.

Pessoal chegamos ao final deste artigo, espero que gostem, um forte abraço e até a próxima!