and
Aprenda o operador lógico and do PHP — diferenças em relação a &&, precedência, avaliação em curto-circuito e armadilhas de atribuição.
O Operador and do PHP
O PHP possui dois operadores lógicos AND: && e and. Ambos retornam true somente quando ambos os operandos são avaliados como true, e false caso contrário. A diferença está na precedência de operadores: && tem precedência muito maior do que and. Essa única diferença é responsável por quase todos os bugs envolvendo and, por isso esta página a trata com cuidado.
Este guia explica a sintaxe de and, como funciona a avaliação em curto-circuito, por que a precedência importa e a clássica armadilha de atribuição a evitar.
Sintaxe
O operador and combina duas condições em uma única expressão boolean. É mais usado dentro de uma instrução if para exigir que várias condições sejam verdadeiras ao mesmo tempo:
<?php
if (condition1 and condition2) {
// Runs only if BOTH conditions are true
}O corpo é executado somente quando ambos os operandos são verdadeiros. A expressão condition1 and condition2 em si é avaliada como um boolean (true ou false), portanto você também pode armazenar o resultado em uma variável — mas fique atento à armadilha de atribuição descrita abaixo.
Como o and se comporta
$a | $b | $a and $b |
|---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
O PHP avalia and da esquerda para a direita e utiliza curto-circuito: se o operando da esquerda for falso, o operando da direita nunca é avaliado, pois o resultado não pode mais ser true. Isso é útil para proteger uma verificação cara ou insegura por trás de uma verificação simples:
<?php
$user = null;
// isLoggedIn() is never called because $user is null,
// so we avoid a "method on null" error.
if ($user !== null and $user->isLoggedIn()) {
echo "Welcome back." . PHP_EOL;
} else {
echo "Please log in." . PHP_EOL;
}
// Output: Please log in.Exemplos
<?php
// Example 1
$age = 25;
$hasID = true;
if ($age >= 18 and $hasID) {
echo "You may enter the club." . PHP_EOL;
}
// Output: You may enter the club.
// Example 2
$username = "admin";
$password = "password123";
if ($username == "admin" and $password == "password123") {
echo "Access granted." . PHP_EOL;
}
// Output: Access granted.
// Example 3
$isWeekday = true;
$time = "12:30";
if ($isWeekday and $time >= "09:00" and $time <= "17:00") {
echo "The office is open." . PHP_EOL;
}
// Output: The office is open.Cada if combina várias condições com and, e o corpo é executado somente quando todas elas são verdadeiras.
Precedência: and vs &&
and tem precedência muito baixa — menor do que ||, menor do que =, e menor do que or (and é mais alto do que or, mas ambos ficam próximos ao final da tabela de precedência). O operador &&, por outro lado, tem precedência alta — logo abaixo dos operadores de comparação. Misturar operadores lógicos com aritmética, atribuição ou or frequentemente exige parênteses.
Quando and e or aparecem juntos, and é avaliado primeiro:
<?php
$age = 16;
$hasID = false;
$isStudent = true;
// Reads as: ($age >= 18 and $hasID) or $isStudent
if ($age >= 18 and $hasID or $isStudent) {
echo "Access granted." . PHP_EOL;
}
// Output: Access granted.Adicione parênteses para tornar o agrupamento explícito ou para substituí-lo:
<?php
$age = 16;
$hasID = false;
$isStudent = true;
// Force the OR to be checked first
if ($age >= 18 and ($hasID or $isStudent)) {
echo "Access granted." . PHP_EOL;
} else {
echo "Access denied." . PHP_EOL;
}
// Output: Access denied.A armadilha da atribuição
Esta é a armadilha que faz a maioria dos desenvolvedores preferir &&. Como and tem precedência menor do que =, a atribuição acontece antes do and:
<?php
$a = true;
$b = false;
// Parsed as: ($result = $a) and $b
$result = $a and $b;
var_dump($result); // bool(true) — NOT false!
// With && (higher precedence than =) you get what you expect:
$result = $a && $b;
var_dump($result); // bool(false)No primeiro caso, $result recebe o valor de $a (true) primeiro, e a parte and $b é avaliada e descartada. Use && para expressões boolean e reserve and para casos em que a baixa precedência é intencional.
Quando usar and
- Prefira
&¶ o valor de uma expressão boolean (qualquer coisa que você atribua ou retorne). andé útil como conector de fluxo de controle onde sua baixa precedência é inofensiva e tem boa legibilidade, por exemplo:$db->connect() or die('No DB')usaorda mesma forma.- Dentro de uma condição
if (...)sem=ouormisturados,ande&&se comportam de forma idêntica.
Operadores relacionados
or— OR lógico (verdadeiro se qualquer operando for verdadeiro).xor— OR exclusivo lógico (verdadeiro se exatamente um operando for verdadeiro).- Operadores PHP — a referência completa de operadores.
- PHP if...else...elseif — construindo lógica condicional.
Conclusão
O operador and combina condições e retorna true somente quando ambas são verdadeiras, com curto-circuito quando o operando esquerdo é falso. É funcionalmente idêntico a &&, mas tem precedência muito menor, e é exatamente por isso que $x = $a and $b não faz o que parece. Use && para valores boolean e escolha and deliberadamente quando sua baixa precedência for o que você deseja.