Gestern bin ich darüber gestolpert, als ich PHP-Code geändert habe, der von jemand anderem geschrieben wurde. Ich war verblüfft, dass ein einfacher Vergleich ( if ($var ==! " ")
) nicht wie erwartet funktionierte. Nach einigen Tests wurde mir klar, dass derjenige, der diesen Code schrieb, ihn ==!
nicht !==
als Vergleichsoperator verwendete. Ich habe noch nie ==!
in einer Sprache gesehen, also habe ich mich gefragt, wie zum Teufel dieser Code überhaupt funktionieren könnte, und einige Tests durchgeführt:
<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>
Dies erzeugt diese Ausgabe:
int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)
Der Operator scheint für boolesche und ganzzahlige Variablen zu funktionieren, nicht jedoch für Zeichenfolgen. Ich kann ==!
in der PHP-Dokumentation oder in einer Suchmaschine nichts darüber finden (versucht Google, Bing, DuckDuckGo, aber ich vermute, sie versuchen, es zu interpretieren, anstatt nach der wörtlichen Zeichenfolge zu suchen). Hat das schon jemand gesehen und kann dieses Verhalten beleuchten?
quelle
Antworten:
Der Unterschied besteht darin, dass es keinen Operator gibt
==!
.Dieser Ausdruck:
Ist im Grunde das gleiche wie das:
quelle
==!
In PHP gibt es keinen OperatorEs ist nur eine Kombination aus
==
und!
. Hier ist nur der relevante Betreiber anwesend==
. Die Kombination==!
funktioniert also wie gewohnt==
, überprüftEquality
und vertraut mir.ist kein anderer als
und somit;
Und
Das Kombinieren mehrerer Operatorzeichen funktioniert möglicherweise nicht immer als Operator. wenn wir zum Beispiel nehmen
=
und!
wird es als Betreiber nur funktionieren , wenn es in dem Muster ist!=
oder!==
. Es kann wie zahlreiche Kombinationen für diese Zeichen!====
,!==!
etc .. etc .. Operator Kombinationen in sein sollten einzigartiges Format , einzigartige Reihenfolge , einzigartige Kombinationen (alle Zeichen würden nicht kombinieren mit allen anderen Zeichen) und auf jedem Fall, ohne Raum zwischen ihnen .Überprüfen Sie die Bedienerliste unten;
quelle
<table>
.==!
ist kein Operator, sondern zwei:==
und!
!
mit einer höheren Priorität als==
So :
"a" !== " ": bool(true)
-> wahr, weil "a" wirklich nicht gleich "" ist"a" ==! " ": bool(false)
-> false, weil "a" nicht gleich ist! ""Könnte mit einem Leerzeichen zwischen == und! Geschrieben werden.
quelle
false because "a" is not equals to !" "
! "" bedeutet gegossen, um das zu boolen und zu negieren, also "" ist wahr und! "" ist falsch.==!
existiert nicht als solche. Es ist eine etwas kryptische Notation von== !
Da Leerzeichen bei diesen Operationen keine Rolle spielen, können Sie genauso einfach schreiben
a --> b
, was ausgewertet wirda-- > b
, aber seltsam aussieht.Also, was die Frage
"a" ==! " "
betrifft : wird analysiert"a" == !" "
. Negierung einer Zeichenkette wird durch abgedeckt Gießen , was bedeutet , eine beliebige Zeichenfolge aber"0"
und" "
ist, wenn gegossen,true
.Somit wird der Ausdruck
"a" == !" "
übertragen:"a" == !" "
"a" == !false
"a" == true
Und da dies
string "a"
nicht dasselbe istbool true
, bewertet dies den gesamten Ausdruck zufalse
.Also, was ist die Moral der Geschichte? Lassen Sie sich nicht durch fehlende oder falsch platzierte Leerzeichen verwirren! :) :)
quelle
==! ist kein Operator
==!
ist überhaupt kein PHP-Vergleichsoperator - es ist dasselbe wie== !
(beachten Sie das Leerzeichen)Dh
quelle