Operadores
Esta aula cobre os operadores em PHP, incluindo aritméticos, comparação, lógicos, a diferença entre == e ===, operadores modernos (??, ?:, ?->) e o operador spaceship (<=>). São apresentados exemplos práticos e exercícios para fixação.
Operadores são símbolos que permitem realizar operações em variáveis e valores. Em PHP, eles são fundamentais para controle de fluxo, cálculos e manipulação de dados. Nesta aula, exploraremos os principais grupos de operadores, com foco em nuances importantes como a diferença entre igualdade e identidade, operadores modernos que simplificam o código, e o operador spaceship, que facilita comparações de três vias.
Aritméticos, comparação, lógicos
Os operadores aritméticos realizam operações matemáticas básicas: adição (+), subtração (-), multiplicação (*), divisão (/), módulo (%), exponenciação (**). Já os operadores de comparação comparam dois valores e retornam um booleano: igual (==), idêntico (===), diferente (!=, <>), não idêntico (!==), maior (>), menor (<), maior ou igual (>=), menor ou igual (<=). Os operadores lógicos combinam expressões booleanas: and (&&), or (||), not (!), xor.
Exemplo prático:
$a = 10;
$b = 3;
echo $a + $b; // 13
echo $a % $b; // 1
echo $a ** 2; // 100
var_dump($a > $b); // bool(true)
var_dump($a == '10'); // bool(true)
var_dump($a === '10'); // bool(false)
if ($a > 5 && $b < 5) {
echo "Ambas condições verdadeiras";
}
== vs ===
O operador == (igualdade) compara valores após conversão de tipo (type juggling). Já o === (identidade) compara valor e tipo, sem conversão. Isso evita comportamentos inesperados.
Exemplo:
$num = 0;
$str = "0";
$vazio = "";
var_dump($num == $str); // true (0 == 0)
var_dump($num === $str); // false (int vs string)
var_dump($num == $vazio); // true (0 == ""? Sim!)
var_dump($num === $vazio); // false
Portanto, sempre prefira === para comparações seguras, a menos que você explicitamente queira a conversão de tipo.
Operadores modernos (??, ?:, ?->)
O operador null coalescing (??) retorna o primeiro operando se ele não for null, caso contrário o segundo. É útil para fornecer valores padrão. O operador ternário (?:) retorna o valor da expressão se ela for avaliada como true, senão o segundo operando. O operador nullsafe (?->) permite chamar métodos ou acessar propriedades em objetos que podem ser null, evitando erros.
Exemplos:
$nome = $_GET['nome'] ?? 'Visitante';
echo $nome;
$idade = $usuario->idade ?? 0;
// Ternário
$status = ($idade >= 18) ? 'Maior' : 'Menor';
// Nullsafe (PHP 8+)
$cidade = $usuario?->endereco?->cidade ?? 'Desconhecida';
Spaceship
O operador spaceship (<=>) compara duas expressões e retorna -1, 0 ou 1 se o primeiro for menor, igual ou maior que o segundo, respectivamente. É usado em funções de ordenação (usort, etc.) e em comparações combinadas.
Exemplo:
$valores = [3, 1, 4, 1, 5];
usort($valores, fn($a, $b) => $a <=> $b);
print_r($valores); // [1, 1, 3, 4, 5]
// Comparação
var_dump(5 <=> 10); // int(-1)
var_dump(10 <=> 10); // int(0)
var_dump(10 <=> 5); // int(1)
Boas práticas e observações finais
Use === em vez de == para evitar bugs sutis. Prefira ?? para valores padrão, e ?-> para encadeamento seguro em objetos. O spaceship é ideal para ordenação. Lembre-se que operadores lógicos têm precedência: && e || são de curto-circuito, então a segunda expressão pode não ser avaliada.
Referências
- PHP: Operadores - Manual
- PHP: Operadores de Comparação
- PHP 8.0: Nullsafe Operator
- PHP: Operador Spaceship
- PHP: Operadores Lógicos
Exercícios
-
Explique por que o código abaixo imprime "igual" e corrija para que imprima "diferente":
$a = 0; $b = "0"; if ($a == $b) { echo "igual"; } else { echo "diferente"; }✓ Resposta: O operador == converte tipos, então 0 e "0" são considerados iguais. Para corrigir, use ===:if ($a === $b) { echo "igual"; } else { echo "diferente"; } -
Escreva uma expressão usando o operador null coalescing que atribua o valor 'padrão' à variável $valor se $_GET['chave'] não existir ou for null.
✓ Resposta:
$valor = $_GET['chave'] ?? 'padrão'; -
Dado o array $notas = [8, 5, 7], use usort com o operador spaceship para ordená-lo em ordem decrescente.
✓ Resposta:
usort($notas, fn($a, $b) => $b <=> $a); print_r($notas); // [8, 7, 5] -
Explique o que o operador ?-> faz e dê um exemplo de uso.
✓ Resposta: O operador ?-> (nullsafe) permite acessar propriedades ou métodos de um objeto que pode ser null, retornando null em vez de gerar um erro. Exemplo:
$cidade = $usuario?->endereco?->cidade; -
Qual é a diferença entre os operadores && e and em PHP? Dê um exemplo de precedência.
✓ Resposta: && tem precedência maior que and. Exemplo:
$result = true && false; // $result = false $result = true and false; // $result = true (atribuição primeiro)