and
Der PHP-and-Operator erklärt — Unterschied zu &&, Operatorpriorität, Kurzschlussauswertung, der Zuweisungsfehler und praktische Beispiele.
Der PHP-Operator and
PHP besitzt zwei logische AND-Operatoren: && und and. Beide geben true nur zurück, wenn beide Operanden zu true ausgewertet werden, andernfalls false. Der Unterschied liegt in der Operatorpriorität: && bindet deutlich stärker als and. Genau dieser eine Unterschied ist für fast jeden Fehler verantwortlich, der mit and zusammenhängt — daher wird er auf dieser Seite sorgfältig behandelt.
Diese Anleitung erklärt die Syntax von and, wie die Kurzschlussauswertung funktioniert, warum die Priorität wichtig ist und welchen klassischen Zuweisungsfehler man vermeiden sollte.
Syntax
Der Operator and verknüpft zwei Bedingungen zu einem boolean-Ausdruck. Er wird am häufigsten innerhalb einer if-Anweisung verwendet, um mehrere Bedingungen gleichzeitig zu fordern:
<?php
if (condition1 and condition2) {
// Runs only if BOTH conditions are true
}Der Rumpf wird nur ausgeführt, wenn beide Operanden wahrhaftig (truthy) sind. Der Ausdruck condition1 and condition2 selbst ergibt einen boolean-Wert (true oder false), sodass man das Ergebnis auch in einer Variablen speichern kann — aber Achtung vor dem Zuweisungsfehler, der weiter unten beschrieben wird.
Verhalten von and
$a | $b | $a and $b |
|---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
PHP wertet and von links nach rechts aus und schließt kurz: Ist der linke Operand falsy, wird der rechte niemals ausgewertet, da das Ergebnis nicht mehr true sein kann. Das ist nützlich, um eine aufwändige oder unsichere Prüfung hinter einer günstigen abzusichern:
<?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.Beispiele
<?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.Jede if-Anweisung verknüpft mehrere Bedingungen mit and, und der Rumpf wird nur ausgeführt, wenn alle davon wahr sind.
Priorität: and vs. &&
and hat eine sehr niedrige Priorität — niedriger als ||, niedriger als = und niedriger als or (and steht zwar über or, aber beide befinden sich nahe am unteren Ende der Prioritätstabelle). Der Operator && hingegen steht weit oben — direkt unterhalb der Vergleichsoperatoren. Das Mischen logischer Operatoren mit Arithmetik, Zuweisung oder or erfordert daher oft Klammern.
Wenn and und or zusammen auftreten, wird and zuerst ausgewertet:
<?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.Klammern hinzufügen, um die Gruppierung explizit zu machen oder zu überschreiben:
<?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.Der Zuweisungsfehler
Das ist die Falle, die dazu führt, dass die meisten Entwickler && bevorzugen. Weil and eine niedrigere Priorität als = hat, erfolgt die Zuweisung vor dem 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)Im ersten Fall wird $result zunächst $a (true) zugewiesen, und der Teil and $b wird ausgewertet und verworfen. Verwende && für boolean-Ausdrücke und behalte and für Fälle vor, in denen die niedrige Priorität gewollt ist.
Wann and verwenden
- Bevorzuge
&&für den Wert eines boolean-Ausdrucks (alles, was du zuweist oder zurückgibst). andist praktisch als Kontrollfluss-Verbinder, wenn seine niedrige Priorität unbedenklich ist und gut lesbar bleibt, zum Beispiel:$db->connect() or die('No DB')verwendetorauf die gleiche Weise.- Innerhalb einer
if (...)-Bedingung ohne gemischtes=oderorverhalten sichandund&&identisch.
Verwandte Operatoren
or— logisches OR (true, wenn mindestens ein Operand true ist).xor— logisches exklusives OR (true, wenn genau ein Operand true ist).- PHP operators — die vollständige Operatorreferenz.
- PHP if...else...elseif — Aufbau von bedingter Logik.
Fazit
Der Operator and verknüpft Bedingungen und gibt true nur zurück, wenn beide wahr sind, mit Kurzschlussauswertung bei einem falsigen linken Operanden. Er ist funktional identisch mit &&, hat jedoch eine deutlich niedrigere Priorität — genau deshalb macht $x = $a and $b nicht das, was es aussieht. Verwende && für boolean-Werte und wähle and bewusst, wenn du seine niedrige Priorität gezielt einsetzen möchtest.