Wczoraj natknąłem się na to, kiedy zmodyfikowałem kod PHP napisany przez kogoś innego. Byłem zaskoczony, że proste porównanie ( if ($var ==! " ")
) nie zadziałało zgodnie z oczekiwaniami. Po kilku testach zdałem sobie sprawę, że ktokolwiek napisał ten kod, używał go ==!
zamiast !==
operatora porównania. Nigdy nie widziałem ==!
w żadnym języku, więc zastanawiałem się, jak, do diabła, ten kod może w ogóle działać i zrobiłem kilka testów:
<?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");
?>
To daje taki wynik:
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)
Operator wydaje się działać dla zmiennych logicznych i całkowitych, ale nie dla łańcuchów. Nie mogę znaleźć ==!
w dokumentacji PHP ani niczego na ten temat w żadnej wyszukiwarce (próbowałem Google, Bing, DuckDuckGo, ale podejrzewam, że próbują to zinterpretować zamiast szukać dosłownego ciągu). Czy ktoś widział to wcześniej i może rzucić trochę światła na to zachowanie?
źródło
Odpowiedzi:
Różnica polega na tym, że nie ma operatora
==!
.To wyrażenie:
Zasadniczo jest taki sam jak ten:
źródło
W
==!
PHP nie ma operatoraTo tylko połączenie
==
i!
. Obecny jest tylko właściwy operator==
. Tak więc połączenie==!
będzie działać jak normalne==
, sprawdzająceEquality
i zaufaj mi,to nikt inny niż
a zatem;
I
Łączenie znaków wielu operatorów może nie zawsze działać jako operator. na przykład, jeśli weźmiemy
=
i!
, będzie działać jako operatory tylko wtedy, gdy będzie we wzorcu!=
lub!==
. Nie może być wiele kombinacji dla tych znaków podoba!====
,!==!
etc .. etc .. kombinacje operator powinien być w wyjątkowej formie , wyjątkowej kolejności , unikalnych kombinacji (wszystkie znaki przyzwyczajenie łączyć ze wszystkimi innymi postaciami) i zdecydowanie, bez przestrzeni pomiędzy nimi .Sprawdź listę operatorów poniżej;
źródło
<table>
.==!
nie jest operatorem, ale dwoma:==
i!
!
mający wyższy priorytet niż==
Więc :
"a" !== " ": bool(true)
-> prawda, ponieważ „a” tak naprawdę nie jest równe „”"a" ==! " ": bool(false)
-> fałsz, ponieważ „a” nie równa się! ""Można zapisać ze spacją między == i!.
źródło
false because "a" is not equals to !" "
! "" oznacza rzutowanie na bool i negowanie, że tak "" jest prawdą, a! "" jest fałszem.==!
nie istnieje jako taki. To nieco tajemnicza notacja== !
Ponieważ spacje nie mają znaczenia w tych operacjach, równie łatwo możesz napisać
a --> b
, którego wynikiem jesta-- > b
, ale będzie wyglądać dziwnie.A więc jeśli chodzi o pytanie:
"a" ==! " "
zostanie przeanalizowany"a" == !" "
. Negacja struny jest objęta odlewem , co oznacza dowolną strunę, ale"0"
i" "
jest, po rzuceniu,true
.W ten sposób wyrażenie
"a" == !" "
zostanie przeniesione:"a" == !" "
"a" == !false
"a" == true
A ponieważ
string "a"
to nie to samo cobool true
, to oblicza całe wyrażenie nafalse
.Więc jaki jest morał tej historii? Nie daj się zmylić brakującymi lub nieprawidłowo umieszczonymi spacjami! :)
źródło
==! nie jest operatorem
==!
nie jest w ogóle operatorem porównania php - jest taki sam jak== !
(zwróć uwagę na spację)To znaczy
źródło