W3docs

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
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

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 && para 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') usa or da mesma forma.
  • Dentro de uma condição if (...) sem = ou or misturados, and e && 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.

Prática

Prática
O que o operador AND faz no PHP?
O que o operador AND faz no PHP?
Was this page helpful?