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

Exercícios

  1. 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";
    }
  2. 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';
  3. 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]
  4. 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;
  5. 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)