Operadores de ComparaçãoComparação
Operadores de comparação, como os seus nomes implicam, permitem que você
compare dois valores. Você pode se interessar em ver
as tabelas de comparação de tipos,
que tem exemplo das várias comparações entre tipos relacionadas.
Operadores de comparaçãoExemploNomeResultado$a == $bIgual&true; se $a é igual a $b após equalização de tipos.$a === $bIdêntico
&true; se $a é igual a $b, e eles são do mesmo
tipo.
$a != $bDiferente&true; se $a não é igual a $b depois de equalização de ativos.$a <> $bDiferente&true; se $a não é igual a $b depois de equalização de ativos.$a !== $bNão idêntico
&true; se $a não é igual a $b, ou eles não são do mesmo
tipo.
$a < $bMenor que&true; se $a é estritamente menor que $b.$a > $bMaior que&true; se $a é estritamente maior que $b.$a <= $bMenor ou igual&true; se $a é menor ou igual a $b.$a >= $bMaior ou igual&true; se $a é maior ou igual a $b.$a <=> $bSpaceship (nave espacial)
Um int menor que, igual a ou maior que zero quando
$a é, respectivamente, menor que, igual a ou maior
que $b.
Se ambos os operadores são
strings numéricas,
ou um operando é um número e o outro é uma
string numérica,
então a comparação é realizada numericamente.
Estas regras se aplicam à instrução
switch.
A conversão de tipos não é realizada quando a comparação é realizada através
=== ou !== porque aqui
é realizada a comparação de tipos, além de valores.
Anteriormente ao PHP 8.0.0, se uma string era comparada a um número
ou uma string numérica, então a string era convertida para
número antes de realizar a comparação. Isto pode levar a resultados
inesperados, como observado no exemplo a seguir:
]]>
&example.outputs.7;
&example.outputs.8;
Operadores de Comparação
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
// Objetos
$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
// valores e tipos precisam coincidir
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b, ' '; // 1
?>
]]>
Para vários tipos, comparações são feitas de acordo com a seguinte
tabela (em ordem).
Comparação com vários tiposTipo do 1º operandoTipo do 2º operandoResultadonull ou stringstringConverte &null; para "", numérico ou comparação léxicabool ou nullqualquerConverte para bool, &false; < &true;objectobjectClasses nativas podem definir suas próprias comparações, classes diferentes
são incomparáveis, same class see Comparação de Objetos
string, resource, int ou floatstring, resource, int ou floatTransforma strings e resources para númerosarrayarrayArray com menos membros é menor, se a chave do operando 1 não é
encontrada no operando 2, então os arrays são incomparáveis, caso contrário compara
valor por valor (veja o seguinte exemplo)objectqualquerobject é sempre maiorarrayqualquerarray é sempre maior
Comparações de boolean e null
]]>
Transcrição do padrão de comparação de array
count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return 1;
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
]]>
Comparison of floating point numbers
Por conta da forma que floats são representados internamente não
se deve testar dois floats com o comparador de igualdade.
Veja a documentação de float para mais detalhes.
Cuidado. A conversão automática de tipos do PHP não é sempre tão óbiva, quando comparando valores de tipos diferentes,
particularmente comparando &integer;s para &boolean;s ou &integer;s para &string;s. No geral é
recomendado utilizar as comparações === e !== em vez de utilizar
== e != na maioria dos casos.
Valores não comparáveis
Embora a comparação de identidade (=== e !==)
possa ser aplicada para valores arbitrários, os outros operadores de comparação somente devem
ser aplicados a valores comparáveis. O resultado de comparação de valores não comparáveis
não é definida, e não pode ser garantida.
&reftitle.seealso;
strcasecmpstrcmpArray operatorsTypesOperador Ternário
Outro operador condicional é o operador "?:" (ou ternário).
Atribuindo um valor padrão
]]>
A expressão (expr1) ? (expr2) : (expr3)
é avaliada para expr2 se
expr1 é avaliada como &true;, ou
expr3 se
expr1 é avaliada como &false;.
É possível deixar vazia a parte central do operador ternário.
A expressão expr1 ?: expr3 retorna
o resultado de expr1 se expr1
avaliar para &true;, e expr3 se não.
expr1 somente é avaliada nessa única situação.
Note que o operador ternário é uma expressão, e ele não é
avaliado para uma variável, mas para o resultado de uma expressão. Isto é
importante saber se você quer retornar uma variável por referência.
A declaração return $var == 42 ? $a : $b; em uma
função que retorna por referência conseqüêntemente não irá funcionar e será
avisado.
É recomendado evitar empilhar operadores ternários.
O comportamento do PHP quando utilizando mais de um operador ternário sem parênteses numa única
expressão é menos óbvia, comparada a outras linguagesn.
Antes do PHP 8.0.0, os operadores ternários eram avaliados com associatividade à esquerda,
em vez de associatividade à direta, como na maioria de outras linguagens.
Depender da associatividade à esquerda foi descontinuado a partir do PHP 7.4.0.
A partir do PHP 8.0.0, o operador ternário é não associativo.
Comportamento não óbvio do ternário
]]>
Encadeamento de ternários curtos (?:), é estável, e comporta-se intuitivamente.
Ele avaliará como o primeiro argumento que avalia para uma valor não falso. Observe que valores
não definidos irão emitir um alerta.
Encadeamento de ternários curtos
]]>
Operador de aglunitação null (Null Coalescing)
Existe ainda o operador "??" (ou null coalescing).
Atribuindo um valor padrão
]]>
A expressão (expr1) ?? (expr2) é avaliada para
expr2 se expr1 for
&null;, e expr1 do contrário.
Esse operador em particular não emite aviso caso o valor da esquerda
não exista, assim como isset. Sendo especialmente
útil em chaves de arrays.
Note que o operador null coalescing é uma expressão, e ele
não é avaliado para uma variável, mas para o resultado de uma expressão. Isto
é importante saber se você quer retornar uma variável por referência.
A declaração return $foo ?? $bar; em uma
função que retorna por referência conseqüêntemente não irá funcionar e será
avisado.
O operador de aglutinação null tem baixa precedência. Isso significa que misturá-lo
com outros operadores (como por exemplo concatenação ou aritmética)
irá provavelmente exigir parênteses.
]]>
Note que o operador null coalescing permite a criação de aninhamentos simples:
Aninhando o operador null coalescing
]]>