Um operador recebe um ou mais valores e produz um novo: $a + $b soma, $a . $b junta strings, $a && $b é um E lógico, $a === $b compara, $i++ incrementa.
/ retorna um float, a menos que dois inteiros se dividam exatamente: 17 / 5 é 3.4, 10 / 5 é o inteiro 2. Quando você quer só a parte inteira, use intdiv(). Arredondamento é explicado na página de matemática.
Operadores aritméticos
| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
+ | Adição | 7 + 2 | 9 |
- | Subtração | 7 - 2 | 5 |
* | Multiplicação | 7 * 2 | 14 |
/ | Divisão | 7 / 2 | 3.5 |
% | Módulo (resto) | 7 % 2 | 1 |
** | Potência | 7 ** 2 | 49 |
-$a | Negação | -7 | -7 |
O módulo é útil para "a cada N itens" e para verificar par ou ímpar. O resultado tem o sinal do lado esquerdo, e dividir por zero lança um erro que você pode capturar:
Operadores de atribuição
= guarda um valor. Cada operador aritmético e de string tem uma forma combinada que atualiza a variável no lugar.
??= faz parte da família do operador de coalescência nula. Ele só atribui quando a variável não está definida ou é null.
Incremento e decremento: ++ e --
$i++ retorna o valor atual e depois soma 1. ++$i soma 1 e depois retorna o novo valor. A diferença só aparece quando você usa o resultado na mesma expressão.
O truque com letras é como muitas vezes se geram nomes de colunas de planilha (A, B, ... Z, AA).
Operadores lógicos: &&, ||, ! e xor
| Operador | Verdadeiro quando |
|---|---|
$a && $b | os dois são verdadeiros |
$a || $b | pelo menos um é verdadeiro |
!$a | $a é falso |
$a xor $b | exatamente um é verdadeiro |
$a and $b, $a or $b | o mesmo que && e ||, com precedência menor |
&& e || fazem curto-circuito: o lado direito não é avaliado quando o lado esquerdo já decide o resultado. É isso que torna isset($user) && $user->isAdmin() seguro.
and ou &&: a armadilha da precedência
and e or têm ligação mais fraca que =, então numa atribuição eles são aplicados depois que o valor é guardado. Este é um bug clássico:
A precedência baixa é útil num idioma, $file = fopen($path, 'r') or die('Cannot open');, em que você quer que a atribuição aconteça primeiro. Em todo o resto, use && e ||.
Operadores de string: . e .=
O PHP tem dois operadores de string: . junta duas strings ("Grace" . " " . "Hopper") e .= acrescenta a uma variável ($html .= "<li>"). + nunca junta strings: "3" + "4" é o número 7, enquanto "3" . "4" é a string "34". A página sobre strings explica interpolação e aspas.
Comparação e o operador spaceship <=>
== compara depois de converter os tipos, === também verifica o tipo, e <=> retorna -1, 0 ou 1, exatamente o que callbacks de ordenação precisam. Os detalhes e a tabela completa de comparação frouxa estão na página sobre operadores de comparação.
Operadores de array
+ em arrays é uma união: as chaves do array da esquerda vencem e só as chaves ausentes são adicionadas a partir da direita. Isso surpreende quem espera que ele acrescente no fim. == verifica os mesmos pares chave/valor, === também exige a mesma ordem e os mesmos tipos.
Para acrescentar uma lista a outra, use array_merge() ou a sintaxe spread [...$a, ...$b].
Precedência de operadores
Quando uma expressão mistura operadores, o PHP os aplica numa ordem fixa. Os que mais confundem, com o que o PHP 8.3 imprime:
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
Na dúvida, adicione parênteses. Eles não custam nada, e quem ler a linha depois não precisa lembrar da tabela.
Perguntas frequentes
Qual a diferença entre and e && no PHP?
Os dois são E lógico, mas and tem precedência menor que =. Então $x = true and false; guarda true em $x (a atribuição acontece primeiro), enquanto $x = true && false; guarda false. Use && e || em expressões e deixe and/or fora das atribuições.
O que faz o % no PHP?
% é o operador de módulo: ele retorna o resto de uma divisão inteira, então 10 % 3 é 1. O resultado tem o sinal do operando da esquerda (-7 % 3 é -1). Para floats use fmod(), e % 0 lança um DivisionByZeroError.
Como elevo um número a uma potência no PHP?
Use o operador **: 2 ** 10 é 1024. Ele é associativo à direita, então 2 ** 3 ** 2 é 2 ** 9 = 512, e tem prioridade sobre o menos unário, então -2 ** 2 é -4. A função pow(2, 10) faz o mesmo.
Qual a diferença entre $i++ e ++$i no PHP?
Os dois somam 1 a $i. $i++ (pós-incremento) retorna o valor antigo e depois incrementa; ++$i (pré-incremento) incrementa primeiro e retorna o novo valor. Numa linha sozinha, como o passo de um loop for, não há diferença.