W3docs

and

Aprende el operador lógico and en PHP — diferencias con &&, precedencia, evaluación en cortocircuito, la trampa de la asignación y ejemplos prácticos.

El operador and en PHP

PHP tiene dos operadores lógicos AND: && y and. Ambos devuelven true solo cuando ambos operandos evalúan a true, y false en caso contrario. La diferencia está en la precedencia de operadores: && tiene mucha más precedencia que and. Esa única diferencia es la responsable de casi todos los errores relacionados con and, por lo que esta página la explica con detalle.

Esta guía explica la sintaxis de and, cómo funciona la evaluación en cortocircuito, por qué importa la precedencia y la clásica trampa de la asignación que hay que evitar.

Sintaxis

El operador and combina dos condiciones en una expresión boolean. Se usa con mayor frecuencia dentro de una sentencia if para exigir que varias condiciones se cumplan al mismo tiempo:

<?php

if (condition1 and condition2) {
  // Runs only if BOTH conditions are true
}

El cuerpo se ejecuta solo cuando ambos operandos son verdaderos. La expresión condition1 and condition2 en sí evalúa a un boolean (true o false), por lo que también puedes almacenar el resultado en una variable, pero ten cuidado con la trampa de la asignación descrita más adelante.

Cómo se comporta and

$a$b$a and $b
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

PHP evalúa and de izquierda a derecha y aplica cortocircuito: si el operando izquierdo es falso, el operando derecho nunca se evalúa, porque el resultado ya no puede ser true. Esto es útil para proteger una comprobación costosa o insegura detrás de una barata:

<?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.

Ejemplos

<?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 varias condiciones con and, y el cuerpo se ejecuta solo cuando todas son verdaderas.

Precedencia: and vs &&

and tiene una precedencia muy baja — menor que ||, menor que =, y menor que or (and es superior a or, pero ambos se sitúan cerca de la parte inferior de la tabla de precedencia). El operador &&, en cambio, tiene una precedencia alta — justo por debajo de los operadores de comparación. Combinar operadores lógicos con aritmética, asignación o or a menudo requiere paréntesis.

Cuando and y or aparecen juntos, and se evalúa primero:

<?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.

Añade paréntesis para hacer explícita la agrupación o para anularla:

<?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.

La trampa de la asignación

Esta es la trampa que lleva a la mayoría de los desarrolladores a preferir &&. Como and tiene una precedencia menor que =, la asignación ocurre antes que el 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)

En el primer caso, se asigna a $result el valor de $a (true) primero, y la parte and $b se evalúa y se descarta. Usa && para expresiones boolean y reserva and para los casos en que la baja precedencia es intencionada.

Cuándo usar and

  • Prefiere && para el valor de una expresión boolean (cualquier cosa que asignes o devuelvas).
  • and es útil como conector de flujo de control donde su baja precedencia es inocua y se lee bien; por ejemplo: $db->connect() or die('No DB') usa or de la misma manera.
  • Dentro de una condición if (...) sin = ni or mezclados, and y && se comportan de forma idéntica.

Operadores relacionados

  • or — OR lógico (true si alguno de los operandos es true).
  • xor — OR exclusivo lógico (true si exactamente uno de los operandos es true).
  • Operadores PHP — la referencia completa de operadores.
  • PHP if...else...elseif — construcción de lógica condicional.

Conclusión

El operador and combina condiciones y devuelve true solo cuando ambas son verdaderas, aplicando cortocircuito en un operando izquierdo falso. Es funcionalmente igual que && pero tiene una precedencia mucho menor, que es exactamente la razón por la que $x = $a and $b no hace lo que parece. Usa && para valores boolean y elige and deliberadamente cuando su baja precedencia es lo que deseas.

Práctica

Práctica
¿Qué hace el operador AND en PHP?
¿Qué hace el operador AND en PHP?
Was this page helpful?