W3docs

and

Scopri l'operatore logico and in PHP — differenze da &&, precedenza degli operatori, cortocircuito e la trappola dell'assegnamento.

L'operatore and in PHP

PHP dispone di due operatori AND logici: && e and. Entrambi restituiscono true solo quando entrambi gli operandi sono valutati come true, e false in caso contrario. La differenza sta nella precedenza degli operatori: && ha una precedenza molto più alta rispetto a and. Questa singola differenza è responsabile di quasi tutti i bug che coinvolgono and, quindi questa pagina la analizza con attenzione.

Questa guida spiega la sintassi di and, come funziona la valutazione a cortocircuito, perché la precedenza è importante e la classica trappola dell'assegnamento da evitare.

Sintassi

L'operatore and combina due condizioni in un'unica espressione boolean. Viene utilizzato più spesso all'interno di un'istruzione if per richiedere che più condizioni siano soddisfatte contemporaneamente:

<?php

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

Il corpo viene eseguito solo quando entrambi gli operandi sono veritieri. L'espressione condition1 and condition2 si valuta come un boolean (true o false), quindi è possibile memorizzare il risultato in una variabile — ma attenzione alla trappola dell'assegnamento descritta di seguito.

Comportamento di and

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

PHP valuta and da sinistra a destra e applica il cortocircuito: se l'operando sinistro è falso, quello destro non viene mai valutato, perché il risultato non può più essere true. Questo è utile per proteggere un controllo costoso o non sicuro dietro uno più economico:

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

Esempi

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

Ogni if combina più condizioni con and, e il corpo viene eseguito solo quando tutte sono vere.

Precedenza: and vs &&

and ha una precedenza molto bassa — inferiore a ||, inferiore a = e inferiore a or (and è più alto di or, ma entrambi si trovano vicino al fondo della tabella di precedenza). L'operatore &&, al contrario, ha una precedenza alta — appena sotto gli operatori di confronto. Mescolare operatori logici con aritmetica, assegnamento o or richiede quindi spesso l'uso di parentesi.

Quando and e or compaiono insieme, and viene valutato per primo:

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

Aggiungere parentesi per rendere esplicito il raggruppamento o per modificarlo:

<?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 trappola dell'assegnamento

Questa è la trappola che spinge la maggior parte degli sviluppatori a preferire &&. Poiché and ha una precedenza inferiore a =, l'assegnamento avviene prima di 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)

Nel primo caso, $result viene assegnato il valore di $a (true) per primo, e la parte and $b viene valutata e scartata. Usa && per le espressioni boolean e riserva and ai casi in cui la bassa precedenza è intenzionale.

Quando usare and

  • Preferisci && per il valore di un'espressione boolean (qualsiasi cosa tu assegni o restituisca).
  • and è utile come connettore di flusso di controllo in cui la sua bassa precedenza è inoffensiva e si legge bene, ad esempio: $db->connect() or die('No DB') usa or allo stesso modo.
  • All'interno di una condizione if (...) senza = o or mescolati, and e && si comportano in modo identico.

Operatori correlati

  • or — OR logico (true se uno dei due operandi è true).
  • xor — OR esclusivo logico (true se esattamente uno degli operandi è true).
  • Operatori PHP — il riferimento completo agli operatori.
  • PHP if...else...elseif — costruire la logica condizionale.

Conclusione

L'operatore and combina condizioni e restituisce true solo quando entrambe sono vere, applicando il cortocircuito su un operando sinistro falso. È funzionalmente identico a && ma ha una precedenza molto più bassa, motivo per cui $x = $a and $b non fa ciò che sembra. Usa && per i valori boolean e scegli and deliberatamente quando la sua bassa precedenza è ciò che desideri.

Pratica

Pratica
Cosa fa l'operatore AND in PHP?
Cosa fa l'operatore AND in PHP?
Was this page helpful?