ungleich - php vergleichsoperatoren string
Type-Juggling und(strikte) Größer/Kleiner als Vergleiche in PHP (2)
PHP ist berühmt für sein Typ-Jonglieren. Ich muss zugeben, dass es mich verwirrt, und es fällt mir schwer, grundlegende logische / fundamentale Dinge in Vergleichen herauszufinden.
Zum Beispiel: Wenn $a > $b
wahr ist und $b > $c
wahr ist, muss das auch bedeuten, dass $a > $c
immer auch wahr ist?
Der Grundlogik folgend, würde ich ja sagen, aber ich bin so verwirrt, dass ich PHP darin nicht wirklich vertraue. Vielleicht kann jemand ein Beispiel geben, wo dies nicht der Fall ist?
Ich frage mich auch mit den strikten Kleiner-als- und Strikten-Größer-als-Operatoren (wie ihre Bedeutung als streng beschrieben wird, die ich nur in der Vergangenheit aus den Gleichheitsvergleichen kannte), wenn es einen Unterschied macht, ob linke und rechte Operanden getauscht werden streng ungleichen Werte:
# Precondition:
if ($a === $b) {
throw new Exception(
'Both are strictly equal - can not compare strictly for greater or smaller'
);
}
($a > $b) !== ($b > $a)
Für die meisten Typvergleichskombinationen sind diese größeren / kleineren Vergleichsoperatoren nicht dokumentiert, so dass das Lesen des Handbuchs in diesem Fall nicht wirklich hilfreich war.
Die Vergleichsoperatoren von PHP weichen in mehrfacher Hinsicht von den computerwissenschaftlichen Definitionen ab:
Um eine Äquivalenzrelation zu bilden, muss = reflexiv, symmetrisch und transitiv sein:
PHP
==
Operator ist nicht reflexiv , dh$a == $a
ist nicht immer wahr:var_dump(NAN == NAN); // bool(false)
Hinweis: Die Tatsache, dass ein Vergleich mit
NAN
immerfalse
ist, ist nicht spezifisch für PHP. Es ist vom IEEE-754-Standard für Gleitkommaarithmetik vorgeschrieben ( weitere Informationen ).Der PHP
==
Operator ist symmetrisch , dh$a == $b
und$b == $a
sind immer gleich.PHP
==
Operator ist nicht transitiv , dh von$a == $b
und$b == $c
folgt nicht$a == $c
:var_dump(true == "a"); // bool(true) var_dump("a" == 0); // bool(true) var_dump(true == 0); // bool(false)
Um eine partielle Ordnung zu bilden, muss <=
/ >=
reflexiv, antisymmetrisch und transitiv sein:
PHPs
<=
Operator ist nicht reflexiv , dh$a <= $a
ist nicht immer wahr (Beispiel wie für==
).PHPs
<=
Operator ist nicht anti-symmetrisch , dh von$a <= $b
und$b <= $a
folgt nicht$a == $b
:var_dump(NAN <= "foo"); // bool(true) var_dump("foo" <= NAN); // bool(true) var_dump(NAN == "foo"); // bool(false)
Der PHP
<=
Operator ist nicht transitiv , dh von$a <= $b
und$b <= $c
folgt nicht$a <= $c
(Beispiel wie für==
).Extra: PHPs
<=
Operator ist nicht total , dh sowohl$a <= $b
als auch$b <= $a
können falsch sein:var_dump(new stdClass <= new DateTime); // bool(false) var_dump(new DateTime <= new stdClass); // bool(false)
Um eine strikte partielle Ordnung zu bilden, muss <
/ >
irreflexiv, asymmetrisch und transitiv sein:
PHPs
<
Operator ist irreflexiv , dh$a < $a
ist niemals wahr. Beachten Sie, dass dies erst ab PHP 5.4 gilt . Zuvor wurdeINF < INF
alstrue
bewertet.PHPs
<
Operator ist nicht asymmetrisch , dh von$a < $b
folgt nicht!($b < $a)
(Beispiel wie für<=
nicht antisymmetrisch).PHPs
<
operator ist nicht transitiv , dh von$a < $b
und$b < $c
folgt nicht$a < $c
:var_dump(-INF < 0); // bool(true) var_dump(0 < TRUE); // bool(true) var_dump(-INF < TRUE); // bool(false)
Extra: PHPs
<
Operator ist nicht trichotom , dh alle von$a < $b
,$b < $a
und$a == $b
können falsch sein (Beispiel wie für<=
nicht total).Extra: PHPs
<
Operator kann zirkulär sein , dh es ist möglich, dass$a < $b
,$b < $c
und$c < $a
:var_dump(INF < []); // bool(true) var_dump([] < new stdClass); // bool(true) var_dump(new stdClass < INF); // bool(true)
Hinweis: Im obigen Beispiel wird die Meldung "Objekt der Klasse stdClass konnte nicht in Double konvertiert" ausgegeben.
Sie können ein paar nette Graphen für PHP Vergleichsoperatoren auf PHP Sadness 52 - Vergleichsoperatoren finden .
Als letzte Anmerkung möchte ich darauf hinweisen, dass es zwei Gleichheiten gibt, die PHP garantiert (im Gegensatz zu allem anderen). Diese beiden halten immer, einfach weil der Compiler den einen auf den anderen reduziert:
($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)
Es gibt keine strikt identischen Vergleichsoperatoren ( >==
oder <==
) in PHP (mindestens PHP 5.6.14) , aber es gibt einige Möglichkeiten , eine strikte Typprüfung zu erzwingen, bevor Sie Greater / Lower überprüfen:
- Überprüfen Sie beide Variablentypen mit
if (gettype($a) === gettype($b))
- Erzwingen Sie Ihre benötigte Schriftform, z.
if ((string)$a === (string)$b)
- Erzwinge deinen benötigten Typ-Jongle zB.
if (($a . '') === ($b . ''))
Beachten Sie Folgendes:
- Fließkomma-Präzision ist begrenzt
-
INF
undNAN
sind vom Typfloat
unter ieee754 - Eine Unendlichkeit entspricht einer anderen Unendlichkeit (seit PHP 5.4)
- Die wissenschaftliche Notation
e
ist immer vom Typfloat
und niemalsinteger
auch wenn die Zahl klein ist - Ganzzahlen, die
PHP_INT_MAX
, werden automatisch infloat
konvertiert - Floats über Systemgrenzen erhalten den
INF
Wert - Nicht definierte Variablen haben den Typ und den Wert
NULL
- Ganzzahlen mit
0
werden von oktal in dezimal konvertiert (per Konvention) - Konvertieren von Strings, die eine Ganzzahl mit einer führenden
0
zu einer Ganzzahl striped die führende0
Liste einiger exotischer Vergleiche:
Very strange: $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) float(-INF) false false false false false false float(NAN) float(0) false false false false false false float(NAN) float(1) false false false false false false float(NAN) float(INF) false false false false false false float(NAN) float(NAN) false false false false false false float(NAN) int(-1) false false false false false false float(NAN) int(0) false false false false false false float(NAN) int(1) false false false false false false
Gleich, aber nicht identisch:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b
NULL(NULL) array() false false true true true false NULL(NULL) bool(false) false false true true true false NULL(NULL) float(0) false false true true true false NULL(NULL) int(0) false false true true true false NULL(NULL) str('') false false true true true false array() bool(false) false false true true true false bool(false) float(0) false false true true true false bool(false) int(0) false false true true true false str('') bool(false) false false true true true false bool(false) str('0') false false true true true false float(-INF) bool(true) false false true true true false bool(true) float(1) false false true true true false float(INF) bool(true) false false true true true false float(NAN) bool(true) false false true true true false bool(true) int(-1) false false true true true false bool(true) int(1) false false true true true false bool(true) str("\0") false false true true true false bool(true) str('+') false false true true true false bool(true) str('-') false false true true true false bool(true) str('01') false false true true true false bool(true) str('1') false false true true true false bool(true) str('false') false false true true true false str('text') bool(true) false false true true true false str('true') bool(true) false false true true true false int(0) float(0) false false true true true false str("\0") float(0) false false true true true false str('') float(0) false false true true true false str('+') float(0) false false true true true false str('-') float(0) false false true true true false str('0') float(0) false false true true true false str('false') float(0) false false true true true false str('text') float(0) false false true true true false str('true') float(0) false false true true true false int(1) float(1) false false true true true false float(1) str('01') false false true true true false float(1) str('1') false false true true true false str("\0") int(0) false false true true true false str('') int(0) false false true true true false str('+') int(0) false false true true true false str('-') int(0) false false true true true false int(0) str('0') false false true true true false str('false') int(0) false false true true true false str('text') int(0) false false true true true false str('true') int(0) false false true true true false int(1) str('01') false false true true true false int(1) str('1') false false true true true false str('1') str('01') false false true true true false
Nieder und Größer gleichzeitig?
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) str("\0") true true true true false false float(NAN) str('') true true true true false false float(NAN) str('+') true true true true false false float(NAN) str('-') true true true true false false float(NAN) str('0') true true true true false false float(NAN) str('01') true true true true false false float(NAN) str('1') true true true true false false float(NAN) str('false') true true true true false false float(NAN) str('text') true true true true false false float(NAN) str('true') true true true true false false
Gleich UND identisch:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) NULL(NULL) false false true true true true float(-INF) float(-INF) false false true true true true float(INF) float(INF) false false true true true true
Niedriger oder größer:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b
NULL(NULL) bool(true) false true true false false false float(-INF) NULL(NULL) true false false true false false NULL(NULL) float(1) false true true false false false float(INF) NULL(NULL) true false false true false false float(NAN) NULL(NULL) true false false true false false NULL(NULL) int(-1) false true true false false false NULL(NULL) int(1) false true true false false false NULL(NULL) str("\0") false true true false false false NULL(NULL) str('+') false true true false false false NULL(NULL) str('-') false true true false false false NULL(NULL) str('0') false true true false false false NULL(NULL) str('01') false true true false false false NULL(NULL) str('1') false true true false false false NULL(NULL) str('false') false true true false false false NULL(NULL) str('text') false true true false false false NULL(NULL) str('true') false true true false false false array() bool(true) false true true false false false float(-INF) array() false true true false false false array() float(0) true false false true false false array() float(1) true false false true false false float(INF) array() false true true false false false float(NAN) array() false true true false false false array() int(-1) true false false true false false array() int(0) true false false true false false array() int(1) true false false true false false array() str("\0") true false false true false false str('') array() false true true false false false array() str('+') true false false true false false array() str('-') true false false true false false array() str('0') true false false true false false array() str('01') true false false true false false array() str('1') true false false true false false array() str('false') true false false true false false array() str('text') true false false true false false array() str('true') true false false true false false bool(true) bool(false) true false false true false false float(-INF) bool(false) true false false true false false float(1) bool(false) true false false true false false float(INF) bool(false) true false false true false false float(NAN) bool(false) true false false true false false bool(false) int(-1) false true true false false false int(1) bool(false) true false false true false false bool(false) str("\0") false true true false false false bool(false) str('+') false true true false false false bool(false) str('-') false true true false false false bool(false) str('01') false true true false false false str('1') bool(false) true false false true false false bool(false) str('false') false true true false false false str('text') bool(false) true false false true false false str('true') bool(false) true false false true false false bool(true) float(0) true false false true false false bool(true) int(0) true false false true false false str('') bool(true) false true true false false false bool(true) str('0') true false false true false false float(-INF) float(0) false true true false false false float(-INF) float(1) false true true false false false float(INF) float(-INF) true false false true false false float(-INF) int(-1) false true true false false false float(-INF) int(0) false true true false false false float(-INF) int(1) false true true false false false float(-INF) str("\0") false true true false false false float(-INF) str('') false true true false false false float(-INF) str('+') false true true false false false float(-INF) str('-') false true true false false false float(-INF) str('0') false true true false false false float(-INF) str('01') false true true false false false float(-INF) str('1') false true true false false false float(-INF) str('false') false true true false false false float(-INF) str('text') false true true false false false float(-INF) str('true') false true true false false false float(1) float(0) true false false true false false float(INF) float(0) true false false true false false float(0) int(-1) true false false true false false int(1) float(0) true false false true false false float(0) str('01') false true true false false false str('1') float(0) true false false true false false float(INF) float(1) true false false true false false float(1) int(-1) true false false true false false float(1) int(0) true false false true false false float(1) str("\0") true false false true false false str('') float(1) false true true false false false float(1) str('+') true false false true false false float(1) str('-') true false false true false false float(1) str('0') true false false true false false float(1) str('false') true false false true false false str('text') float(1) false true true false false false str('true') float(1) false true true false false false float(INF) int(-1) true false false true false false float(INF) int(0) true false false true false false float(INF) int(1) true false false true false false float(INF) str("\0") true false false true false false float(INF) str('') true false false true false false float(INF) str('+') true false false true false false float(INF) str('-') true false false true false false float(INF) str('0') true false false true false false float(INF) str('01') true false false true false false float(INF) str('1') true false false true false false float(INF) str('false') true false false true false false float(INF) str('text') true false false true false false float(INF) str('true') true false false true false false int(0) int(-1) true false false true false false int(1) int(-1) true false false true false false str("\0") int(-1) true false false true false false str('') int(-1) true false false true false false str('+') int(-1) true false false true false false str('-') int(-1) true false false true false false str('0') int(-1) true false false true false false int(-1) str('01') false true true false false false str('1') int(-1) true false false true false false str('false') int(-1) true false false true false false str('text') int(-1) true false false true false false str('true') int(-1) true false false true false false int(1) int(0) true false false true false false int(0) str('01') false true true false false false str('1') int(0) true false false true false false int(1) str("\0") true false false true false false str('') int(1) false true true false false false int(1) str('+') true false false true false false int(1) str('-') true false false true false false int(1) str('0') true false false true false false int(1) str('false') true false false true false false str('text') int(1) false true true false false false str('true') int(1) false true true false false false str('') str("\0") false true true false false false str('+') str("\0") true false false true false false str('-') str("\0") true false false true false false str("\0") str('0') false true true false false false str("\0") str('01') false true true false false false str('1') str("\0") true false false true false false str('false') str("\0") true false false true false false str('text') str("\0") true false false true false false str('true') str("\0") true false false true false false str('') str('+') false true true false false false str('') str('-') false true true false false false str('') str('0') false true true false false false str('') str('01') false true true false false false str('') str('1') false true true false false false str('') str('false') false true true false false false str('') str('text') false true true false false false str('') str('true') false true true false false false str('-') str('+') true false false true false false str('+') str('0') false true true false false false str('+') str('01') false true true false false false str('1') str('+') true false false true false false str('false') str('+') true false false true false false str('text') str('+') true false false true false false str('true') str('+') true false false true false false str('-') str('0') false true true false false false str('-') str('01') false true true false false false str('1') str('-') true false false true false false str('false') str('-') true false false true false false str('text') str('-') true false false true false false str('true') str('-') true false false true false false str('0') str('01') false true true false false false str('1') str('0') true false false true false false str('false') str('0') true false false true false false str('text') str('0') true false false true false false str('true') str('0') true false false true false false str('false') str('01') true false false true false false str('text') str('01') true false false true false false str('true') str('01') true false false true false false str('1') str('false') false true true false false false str('text') str('1') true false false true false false str('true') str('1') true false false true false false str('text') str('false') true false false true false false str('true') str('false') true false false true false false str('true') str('text') true false false true false false
$a > $b > $c
Rätsel wenn: $a
ist nicht größer als $c
.
A<C : float(NAN) > str('a') > str('') A<C : float(NAN) > str('a') > str('1') A<C : float(NAN) > str('a') > str('A') A<C : float(NAN) > str('a') > str('0') A<C : float(NAN) > str('1') > str('') A<C : float(NAN) > str('1') > str('0') A<C : float(NAN) > str('A') > str('') A<C : float(NAN) > str('A') > str('1') A<C : float(NAN) > str('A') > str('0') A<C : float(NAN) > str('0') > str('') A<C : str('') > float(NAN) > str('a') A<C : str('') > float(NAN) > str('1') A<C : str('') > float(NAN) > str('A') A<C : str('') > float(NAN) > str('0') A<C : str('a') > str('') > float(NAN) A<C : str('a') > str('1') > float(NAN) A<C : str('a') > str('A') > float(NAN) A<C : str('a') > str('0') > float(NAN) A<C : str('0') > str('') > float(NAN) A==C : bool(true) > str('') > float(NAN) A==C : bool(true) > str('') > float(-INF) A==C : bool(true) > str('') > int(-1) A==C : bool(true) > str('') > float(-1) A==C : bool(true) > array() > float(NAN) A==C : bool(true) > array() > float(INF) A==C : bool(true) > array() > float(-INF) A==C : bool(true) > array() > str('a') A==C : bool(true) > array() > int(1) A==C : bool(true) > array() > float(1) A==C : bool(true) > array() > str('1') A==C : bool(true) > array() > str('A') A==C : bool(true) > array() > int(-1) A==C : bool(true) > array() > float(-1) A==C : bool(true) > int(0) > float(-INF) A==C : bool(true) > int(0) > int(-1) A==C : bool(true) > int(0) > float(-1) A==C : bool(true) > str('0') > float(NAN) A==C : bool(true) > str('0') > float(-INF) A==C : bool(true) > str('0') > int(-1) A==C : bool(true) > str('0') > float(-1) A==C : bool(true) > float(0) > float(-INF) A==C : bool(true) > float(0) > int(-1) A==C : bool(true) > float(0) > float(-1) A==C : int(1) > str('a') > str('1') A==C : int(1) > str('A') > str('1') A==C : float(1) > str('a') > str('1') A==C : float(1) > str('A') > str('1') A==C : str('a') > str('1') > int(0) A==C : str('a') > str('1') > float(0) A==C : str('') > float(-INF) > NULL(NULL) A==C : str('') > float(-INF) > bool(false) A==C : str('') > int(-1) > NULL(NULL) A==C : str('') > int(-1) > bool(false) A==C : str('') > float(-1) > NULL(NULL) A==C : str('') > float(-1) > bool(false) A==C : array() > float(NAN) > NULL(NULL) A==C : array() > float(NAN) > bool(false) A==C : array() > float(INF) > NULL(NULL) A==C : array() > float(INF) > bool(false) A==C : array() > float(-INF) > NULL(NULL) A==C : array() > float(-INF) > bool(false) A==C : array() > str('a') > NULL(NULL) A==C : array() > str('a') > bool(false) A==C : array() > int(1) > NULL(NULL) A==C : array() > int(1) > bool(false) A==C : array() > float(1) > NULL(NULL) A==C : array() > float(1) > bool(false) A==C : array() > str('1') > NULL(NULL) A==C : array() > str('1') > bool(false) A==C : array() > str('A') > NULL(NULL) A==C : array() > str('A') > bool(false) A==C : array() > str('0') > NULL(NULL) A==C : array() > int(-1) > NULL(NULL) A==C : array() > int(-1) > bool(false) A==C : array() > float(-1) > NULL(NULL) A==C : array() > float(-1) > bool(false) A==C : str('') > float(NAN) > bool(false) A==C : str('') > float(NAN) > NULL(NULL) A==C : str('A') > str('1') > int(0) A==C : str('A') > str('1') > float(0) A==C : int(0) > float(-INF) > NULL(NULL) A==C : int(0) > float(-INF) > bool(false) A==C : int(0) > int(-1) > NULL(NULL) A==C : int(0) > int(-1) > bool(false) A==C : int(0) > float(-1) > NULL(NULL) A==C : int(0) > float(-1) > bool(false) A==C : str('0') > float(NAN) > bool(false) A==C : str('0') > float(-INF) > bool(false) A==C : str('0') > int(-1) > bool(false) A==C : str('0') > float(-1) > bool(false) A==C : float(0) > float(-INF) > NULL(NULL) A==C : float(0) > float(-INF) > bool(false) A==C : float(0) > int(-1) > NULL(NULL) A==C : float(0) > int(-1) > bool(false) A==C : float(0) > float(-1) > NULL(NULL) A==C : float(0) > float(-1) > bool(false) A===C : str('0') > float(NAN) > str('0') A===C : str('') > float(NAN) > str('') A===C : str('a') > float(NAN) > str('a') A===C : str('1') > float(NAN) > str('1') A===C : str('A') > float(NAN) > str('A')
Fun String Vergleich: 'Queen' >
'King' >
'Jack' >
'Ace'
Überprüfen Sie auch die PHP-Vergleichstabellen für Paare:
-
isset()
undis_null()
-
if()
undempty()
- Boolean
==
vs.===
Überprüfen Sie die Unterschiede zwischen PHP-Versionen live bei. http://3v4l.org/MAfDu .