Vergleichs-Operatoren

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.

Vergleichsoperatoren
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
(== "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// 0
echo <=> 2// -1
echo <=> 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 [123] <=> [123]; // 0
echo [123] <=> []; // 1
echo [123] <=> [121]; // 1
echo [123] <=> [124]; // -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).

Vergleich mit verschiedenen Typen
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(== TRUE);  // TRUE - dasselbe wie (bool)1 == TRUE
var_dump(== 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, -10NULL10100)); // 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.

Warnung

Vergleich von Fließkommazahlen

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.

Ternärer Operator

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'];
}
?>
Der Ausdruck (ausdr1) ? (ausdr2) : (ausdr3) wird als ausdr2 ausgewertet, wenn ausdr1 als 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.
?>

Null-Coalescing-Operator

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';
}

?>
Der Ausdruck (ausdr1) ?? (ausdr2) wird zu ausdr2 ausgewertet, wenn ausdr1 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

?>