Vergleichs-Operatoren erlauben es – wie der Name schon sagt – zwei Werte zu vergleichen. Wenn Sie an Beispielen verschiedener auf Typen bezogener Vergleiche interessiert sind, können Sie sich die PHP Typvergleich-Tabellen anschauen.
Beispiel | Name | Ergebnis |
---|---|---|
$a == $b | Gleich |
Gibt TRUE zurück, wenn nach der Typ-Jonglage $a
gleich $b ist.
|
$a === $b | Identisch |
Gibt TRUE zurück, wenn $a gleich $b
ist, und beide denselben Typ haben.
|
$a != $b | Ungleich |
Gibt TRUE zurück, wenn nach der Typ-Jonglage $a
nicht gleich $b ist.
|
$a <> $b | Ungleich |
Gibt TRUE zurück, wenn nach der Typ-Jonglage $a
nicht gleich $b ist.
|
$a !== $b | Nicht identisch |
Gibt TRUE zurück, wenn $a nicht gleich $b
ist, oder wenn beide nicht denselben Typ haben.
|
$a < $b | Kleiner als |
Gibt TRUE zurück, wenn $a kleiner als
$b ist.
|
$a > $b | Größer als |
Gibt TRUE zurück, wenn $a größer als
$b ist.
|
$a <= $b | Kleiner gleich |
Gibt TRUE zurück, wenn $a kleiner oder gleich
$b ist.
|
$a >= $b | Größer Gleich |
Gibt TRUE zurück, wenn $a größer oder gleich
$b ist.
|
$a <=> $b | Raumschiff | Eine Ganzzahl (integer) kleiner als, gleich oder größer als 0, wenn $a entsprechend kleiner als, gleich oder größer als $b ist. Verfügbar von PHP 7 an. |
Wenn eine Zahl mit einer Zeichenkette verglichen wird, oder der Vergleich numerische Zeichenketten einschließt, dann wird jede Zeichenkette in eine Zahl umgewandelt, und der Vergleich wird numerisch durchgeführt. Diese Regeln gelten ebenfalls für die switch Anweisung. Die Typumwandlung wird nicht durchgeführt, wenn der Vergleichsoperator === oder !== ist, da diese den Typ als auch den Wert vergleichen.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // wird niemals erreicht, weil "a" bereits mit 0 übereinstimmte
echo "a";
break;
}
?>
<?php
// Ganzzahlen
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Fließkommazahlen
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Zeichenketten
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Objekte
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0
$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// nicht nur die Werte werden verglichen; die Schlüssel müssen übereinstimmen
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 1
?>
Für die verschiedenen Typen wird der Vergleich gemäß der folgenden Tabelle durchgeführt (in der angegebenen Reihenfolge).
Typ des 1. Operanden | Typ des 2. Operanden | Ergebnis |
---|---|---|
null oder string | string | Umwandlung von NULL nach "", dann numerischer oder lexikalischer Vergleich |
bool oder null | anything | Umwandlung beider Werte nach bool, dann FALSE < TRUE |
object | object | Eingebaute Klassen können eigene Vergleichsregeln definieren; unterschiedliche Klassen können nicht verglichen werden; für dieselben Klassen siehe Objektvergleiche |
string, resource oder number | string, resource oder number | Umwandlung von Zeichenketten und Ressourcen in Zahlen, dann numerischer Vergleich |
array | array | Ein Array mit weniger Elementen ist kleiner; wird ein Schlüssel vom ersten Operanden nicht im zweiten gefunden, dann sind die Arrays nicht vergleichbar; andernfalls wird Element für Element verglichen (siehe folgendes Beispiel) |
object | anything | object ist immer größer |
array | anything | array ist immer größer |
Beispiel #1 Boolesche und Null Vergleiche
<?php
// Boolesche Werte und NULL werden immer als Boolesche Werte verglichen
var_dump(1 == TRUE); // TRUE - dasselbe wie (bool)1 == TRUE
var_dump(0 == FALSE); // TRUE - dasselbe wie (bool)0 == FALSE
var_dump(100 < TRUE); // FALSE - dasselbe wie (bool)100 < TRUE
var_dump(-10 < FALSE);// FALSE - dasselbe wie (bool)-10 < FALSE
var_dump(min(-100, -10, NULL, 10, 100)); // NULL - (bool)NULL < (bool)-100 ist FALSE < TRUE
?>
Beispiel #2 Umschreibung von Standard-Array-Vergleichen
<?php
// Arrays werden mit den normalen Vergleichsoperatoren wie folgt verglichen
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // nicht vergleichbar
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Siehe auch strcasecmp(), strcmp(), Array-Operatoren, und den Handbuchabschnitt über Typen.
Aufgrund der Art wie Fließkommazahlen (float) intern dargestellt werden, sollten zwei Fließkommazahlen nicht auf Gleichheit getestet werden.
Weitere Informationen sind der Dokumantation von float zu entnehmen.
Ein weiterer Vergleichs-Operator ist der "?:" (oder ternäre) Operator.
Beispiel #3 Zuweisen eines Standardwerts
<?php
// Beispielanwendung für den ternären Operator
$action = (empty($_POST['action'])) ? 'standard' : $_POST['action'];
// Obiges ist mit dieser if/else-Anweisung identisch
if (empty($_POST['action'])) {
$action = 'standard';
} else {
$action = $_POST['action'];
}
?>
TRUE
ausgewertet wird, und als
ausdr3, wenn
ausdr1 als FALSE
ausgewertet wird.
Seit PHP 5.3 kann man beim ternären Operator den mittleren Teil
weglassen. Der Ausdruck (ausdr1) ?: (ausdr3)
gibt ausdr1 zurück, wenn
ausdr1 als TRUE
ausgewertet wird, und
andernfalls ausdr3.
Hinweis: Es ist zu beachten, das die ternäre Operation ein Ausdruck ist, und nicht als Variable, sondern als Wert eines Ausdrucks ausgewertet wird. Dies ist unbedingt zu berücksichtigen, wenn eine Variable per Referenz zurückgegeben werden soll. Die Anweisung return $var == 42 ? $a : $b; in einer Funktion, die per Referenz zurückgibt, wird daher nicht funktionieren, und eine Warnung erzeugen.
Hinweis:
Die Verschachtelung von ternären Ausdrücken wird nicht empfohlen. Das Verhalten von PHP, wenn mehrere ternäre Operatoren in einer einzelnen Anweisung verwendet werden, ist ungewöhnlich:
Beispiel #4 Ungewöhnliches Verhalten des ternären Operators
<?php
// auf den ersten Blick scheint das folgende 'true' auszugeben
echo (true?'true':false?'t':'f');
// allerdings wird tatsächlich 't' ausgegeben
// das kommt daher, dass ternäre Ausdrücke von links nach rechts ausgewertet werden
// das Folgende ist eine augenfälligere Variante desselben Codes wie oben
echo ((true ? 'true' : false) ? 't' : 'f');
// hier kann man sehen, dass der erste Ausdruck zu 'true' ausgewertet wird,
// was wiederum zu (bool)true ausgewertet wird, und daher wird der Wahr-Zweig
// des zweiten ternären Ausdrucks zurückgegeben.
?>
Weiterhin gibt es den "??" (oder Null-Coalescing) Operator, verfügbar von PHP 7 an.
Beispiel #5 Zuweisung eines Standardwerts
<?php
// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'standard';
// Obiges ist mit dieser if/else-Anweisung identisch
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = 'standard';
}
?>
NULL
ist, und zu ausdr1 andernfalls.
Insbesondere gibt dieser Operator keinen Hinweis aus, wenn der Wert auf der linken Seite nicht existiert, genau wie isset(). Dies ist besonders für Array-Schlüssel nützlich.
Hinweis: Es ist zu beachten, das die Null-Coalescing-Operation ein Ausdruck ist, und nicht als Variable, sondern als Wert eines Ausdrucks ausgewertet wird. Dies ist unbedingt zu berücksichtigen, wenn eine Variable per Referenz zurückgegeben werden soll. Die Anweisung return $foo ?? $bar; in einer Funktion, die per Referenz zurückgibt, wird daher nicht funktionieren, und eine Warnung erzeugen.
Hinweis:
Es ist zu beachten, dass der Null-Coalescing-Operator einfach verschachtelt werden kann:
Beispiel #6 Verschachtelung des Null-Coalescing-Operator
<?php
$foo = null;
$bar = null;
$baz = 1;
$qux = 2;
echo $foo ?? $bar ?? $baz ?? $qux; // gibt 1 aus
?>