Jaka jest różnica między ==
i ===
?
- Jak dokładnie działa luźne
==
porównanie? - Jak dokładnie działa ścisłe
===
porównanie?
Jakie byłyby przydatne przykłady?
źródło
Jaka jest różnica między ==
i ===
?
==
porównanie?===
porównanie?Jakie byłyby przydatne przykłady?
==
i===
Różnica między luźno ==
równym operatorem a ściśle ===
identycznym operatorem została dokładnie wyjaśniona w instrukcji :
Operatory porównania
┌──────────┬───────────┬────────────────────────── ─────────────────────────────────┐ │ Przykład │ Nazwa │ Wynik │ ├──────────┼───────────┼────────────────────────── ─────────────────────────────────┤ │ $ a == $ b │ Równe │ PRAWDA, jeśli $ a jest równe $ b po żonglowaniu typem. │ │ $ a === $ b │ Identyczne │ PRAWDA, jeśli $ a jest równe $ b i są tego samego typu. │ └──────────┴───────────┴────────────────────────── ─────────────────────────────────┘
==
równe porównanieJeśli używasz ==
operatora, lub dowolny inny operator porównania, które wykorzystuje luźno porównanie takie jak !=
, <>
lub ==
, zawsze trzeba spojrzeć na kontekst , aby zobaczyć, co, gdzie i dlaczego coś zostanie przekonwertowany do zrozumienia tego, co się dzieje.
Jako odniesienie i przykład możesz zobaczyć tabelę porównawczą w instrukcji :
Luźne porównania z
==
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ PRAWDA │ FAŁSZ │ 1 │ 0 │ -1 │ „1” │ „0” │ „-1” │ NULL │ tablica () │ „php” │ „” │ ├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤ │ PRAWDA │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ PRAWDA │ FAŁSZ │ PRAWDA │ │ 1 │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ 0 │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ PRAWDA │ │ -1 │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „1” │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „0” │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „-1” │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ NULL │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ PRAWDA │ FAŁSZ │ PRAWDA │ │ array () │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ FALSE │ Ph „php” │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ │ „” │ FAŁSZ │ PRAWDA │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ PRAWDA │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
===
identyczne porównanieJeśli używasz ===
operatora lub dowolnego innego operatora porównania, który używa ścisłego porównania, takiego jak !==
lub ===
, zawsze możesz być pewien, że typy nie zmienią się magicznie , ponieważ nie nastąpi konwersja. Zatem przy ścisłym porównaniu typ i wartość muszą być takie same, a nie tylko wartość.
Jako odniesienie i przykład możesz zobaczyć tabelę porównawczą w instrukcji :
Ścisłe porównania z
===
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ PRAWDA │ FAŁSZ │ 1 │ 0 │ -1 │ „1” │ „0” │ „-1” │ NULL │ tablica () │ „php” │ „” │ ├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤ │ PRAWDA │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ 1 │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ 0 │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ -1 │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „1” │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „0” │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ „-1” │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ NULL │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ FAŁSZ │ FAŁSZ │ │ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ Ph „php” │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ FAŁSZ │ │ „” AL FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ FAŁSZ │ PRAWDA │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
true
lubfalse
. Łatwo to rzucić. Jednak wszystkie inne wartości mają praktycznie nieograniczoną liczbę kombinacji. Jest"five" == 5
?array(0) == 0
?array(0,0,0) == 0
?0.0000000000000000000000000000000000000000000000000001 == array()
?false
różne tablice w javascript, aletrue
dla PHP, o ile ich wartości są równe ."000" != "00"
,"000" == null
,"000" == false
,"0x0" == false
,array() == 0
,false != null
,array() != null
,false == "0x0"
,false == "000"
. W PHP, to naprzeciwko zachowanie:"000" == "00"
,"000" != null
,"000" != false
,"0x0" != false
,array() != 0
,false == null
,array() == null
,false != "0x0"
,false != "000"
.Operator == rzuca między dwoma różnymi typami, jeśli są one różne, podczas gdy operator === wykonuje „porównanie typów”. Oznacza to, że zwróci prawdę tylko wtedy, gdy oba operandy mają ten sam typ i tę samą wartość.
Przykłady:
Ostrzeżenie : dwa wystąpienia tej samej klasy z równoważnymi elementami NIE są zgodne z
===
operatorem. Przykład:źródło
Obraz jest wart tysiąca słów:
==
Tabela równości PHP Double Equals :PHP Triple Equals
===
Equality wykres:Kod źródłowy, aby utworzyć te obrazy:
https://github.com/sentientmachine/php_equality_charts
Medytacja Guru
Ci, którzy chcą zachować zdrowie psychiczne, nie czytają dalej, ponieważ nic z tego nie będzie miało sensu, z wyjątkiem twierdzenia, że tak zaprojektowano fraktal szaleństwa PHP.
NAN != NAN
aleNAN == true
.==
konwertuje lewy i prawy operand na liczby, jeśli lewy jest liczbą. No123 == "123foo"
ale"123" != "123foo"
Ciąg szesnastkowy w cudzysłowie jest czasem zmiennoprzecinkowy i będzie niespodziewanie rzucany, aby unosić się wbrew twojej woli, powodując błąd w czasie wykonywania.
==
nie jest przechodnie, ponieważ"0"== 0
i0 == ""
ale"0" != ""
==
."6" == " 6"
,"4.2" == "4.20"
i"133" == "0133"
ale133 != 0133
. Ale"0x10" == "16"
i"1e3" == "1000"
wystawienie takiej konwersji niespodzianka ciąg do ósemkowej wystąpią zarówno bez instrukcji lub zgody, powodując błąd wykonania.False == 0
,""
,[]
I"0"
.Gdy liczby są wystarczająco duże, to == nieskończoność.
Świeża klasa to == do 1.
Nadzieja:
Jeśli używasz PHP, nie powinieneś używać operatora podwójnej równości, ponieważ jeśli używasz potrójnej równości, jedynymi przypadkami, o które należy się martwić, są NAN i liczby tak bliskie nieskończoności, że są rzutowane na nieskończoność. W przypadku podwójnych równości wszystko może być niespodzianką
==
dla każdego lub może być niespodzianką rzuconą wbrew twojej woli i!=
na coś, co oczywiście powinno być równe.W każdym miejscu, w którym używasz
==
PHP, jest nieprzyjemny zapach kodu z powodu 85 błędów w nim ujawnionych przez niejawne reguły rzutowania, które wydają się projektowane przez miliony programistów programujących ruchem Brownian.źródło
W odniesieniu do JavaScript:
Operator === działa tak samo jak operator ==, ale wymaga, aby jego operandy miały nie tylko tę samą wartość, ale także ten sam typ danych.
Na przykład poniższa próbka wyświetli „xiy są równe”, ale nie „xiy są identyczne”.
źródło
Dodatek do innych odpowiedzi dotyczących porównania obiektów:
== porównuje obiekty na podstawie nazwy obiektu i ich wartości. Jeśli dwa obiekty są tego samego typu i mają te same wartości
$a == $b
składowe , zwraca true.=== porównuje wewnętrzny identyfikator obiektu dla obiektów. Nawet jeśli członkowie są równi,
$a !== $b
jeśli nie są dokładnie tym samym przedmiotem.źródło
Mówiąc najprościej:
== sprawdza, czy ekwiwalent (tylko wartość)
=== sprawdza, czy ten sam (wartość i typ)
Odpowiednik kontra taki sam: analogia
1 + 1 = 2 + 0 (odpowiednik)
1 + 1 = 1 + 1 (to samo)
W PHP:
true == 1 (true - wartość równoważna)
true === 1 (false - nie taki sam pod względem wartości i typu)
źródło
Chodzi o typy danych. Weźmy na przykład
BOOL
(prawda lub fałsz):true
również równa się,1
afalse
także równa się0
==
Nie dba o typach danych przy porównywaniu: Więc jeśli miał zmienną, która jest 1 (co może być równieżtrue
):$var=1;
A następnie porównaj z
==
:Ale
$var
tak naprawdę nie jest równytrue
, prawda?1
Zamiast tego ma wartość int , która z kolei jest równa true.Za
===
pomocą typy danych są sprawdzane, aby upewnić się, że dwie zmienne / obiekty / cokolwiek używają tego samego typu.Więc gdybym to zrobił
warunek ten nie byłby spełniony, ponieważ
$var !== true
jest== true
( tylko jeśli wiesz, co mam na myśli).Dlaczego miałbyś tego potrzebować?
Proste - spójrzmy na jedną z funkcji PHP
array_search()
:array_search()
Funkcja po prostu wyszukuje wartość w tablicy i zwraca kluczowego elementu wartość została znaleziona. Jeśli wartość nie została znaleziona w tablicy, zwraca false . Ale co jeśli zrobiłeśarray_search()
na wartości zapisanej w pierwszym elemencie tablicy (który miałby klucz tablicy0
) ...array_search()
funkcja zwróciłaby 0 ... co jest równe false ...Więc jeśli zrobiłeś:
Czy widzisz, jak może to być teraz problem?
Większość ludzi nie używa
== false
, sprawdzając, czy funkcja zwraca false. Zamiast tego używają!
. Ale w rzeczywistości jest to dokładnie to samo, co używanie==false
, więc jeśli zrobiłeś:W przypadku takich rzeczy należy użyć
===
zamiast tego, aby sprawdzić typ danych.źródło
Jednym z przykładów jest to, że atrybut bazy danych może mieć wartość NULL lub „”:
źródło
php == to operator porównania, który porównuje wartość zmiennych. Ale === porównuje wartość i typ danych.
Na przykład,
W takim przypadku wynikiem będą „Zmienne są równe”, nawet jeśli ich typy danych są różne.
Ale jeśli użyjemy === zamiast ==, wynikiem będzie „Zmienne nie są równe”. PHP najpierw porównuje wartość zmiennej, a następnie typ danych. Tutaj wartości są takie same, ale typy danych są różne.
źródło
Dany
x = 5
1) Operator: == jest „równy”.
x == 8
jest fałszem2) Operator: === jest „dokładnie równy” (wartość i typ)
x === 5
jest prawdą,x === "5"
jest fałszemźródło
Bądź jednak ostrożny. Oto znany problem.
vs.
źródło
Krótko mówiąc, === działa w taki sam sposób, jak == w większości innych języków programowania.
PHP pozwala na dokonywanie porównań, które tak naprawdę nie mają sensu. Przykład:
Chociaż pozwala to na kilka interesujących „skrótów”, powinieneś się wystrzegać, ponieważ funkcja, która zwraca coś, czego nie powinna (np. „Błąd” zamiast liczby), nie zostanie złapana i będziesz zastanawiać się, co się stało.
W PHP == porównuje wartości iw razie potrzeby dokonuje konwersji typu (na przykład ciąg „12343sdfjskfjds” zmieni się na „12343” w porównaniu liczb całkowitych). === porówna wartość ORAZ typ i zwróci false, jeśli typ nie jest taki sam.
Jeśli zajrzysz do instrukcji PHP, zobaczysz, że wiele funkcji zwraca „fałsz”, jeśli funkcja się nie powiedzie, ale mogą zwrócić 0 w udanym scenariuszu, dlatego zalecają wykonanie „if (function ()! == false) ”, aby uniknąć błędów.
źródło
Kilka przykładów
PS
vs.
źródło
Użyłbyś ===, aby sprawdzić, czy funkcja lub zmienna jest fałszem, a nie tylko zrównaniem się z fałszem (zero lub pusty ciąg znaków).
W tym przypadku strpos zwróci 0, co w teście będzie równe false
lub
co nie jest tym, czego chcesz tutaj.
źródło
Jeśli chodzi o to, kiedy używać jednego nad drugim, weźmy na przykład
fwrite()
funkcję w PHP.Ta funkcja zapisuje zawartość w strumieniu plików. Według PHP „
fwrite()
zwraca liczbę zapisanych bajtów lub FAŁSZ w przypadku błędu.”. Jeśli chcesz sprawdzić, czy wywołanie funkcji zakończyło się powodzeniem, ta metoda jest wadliwa:Może zwrócić zero (i jest uważane za udane), a twój stan nadal jest wyzwalany. Właściwy sposób to:
źródło
PHP to luźno napisany język. Użycie operatora podwójnej równości pozwala na swobodne sprawdzanie zmiennej.
Luźne sprawdzenie wartości pozwoliłoby na zrównanie niektórych podobnych, ale nie równych wartości:
Wszystkie te wartości byłyby równe za pomocą operatora podwójnej równości.
źródło
Zmienne mają typ i wartość.
Kiedy używasz tych zmiennych (w PHP), czasami nie masz dobrego typu. Na przykład jeśli tak
PHP musi przekonwertować („rzutować”) $ var na liczbę całkowitą. W tym przypadku „$ var == 1” jest prawdziwe, ponieważ każdy niepusty ciąg jest rzutowany na 1.
Używając ===, sprawdzasz, czy wartość I TYP są równe, więc "$ var === 1" jest fałszem.
Jest to przydatne na przykład, gdy masz funkcję, która może zwrócić false (w przypadku błędu) i 0 (wynik):
Ten kod jest niepoprawny, jakby
myFunction()
zwracał 0, jest rzutowany na false i wydaje się, że masz błąd. Prawidłowy kod to:ponieważ test polega na tym, że zwracana wartość „jest wartością logiczną i jest fałszem”, a nie „może być rzutowana na fałsz”.
źródło
===
Operator ma porównać dokładnie równości treści natomiast==
operator będzie porównać semantycznej równości. W szczególności zmusi ciągi do liczb.Równość jest obszernym przedmiotem. Zobacz artykuł w Wikipedii na temat równości .
źródło
źródło
Wszystkie dotychczasowe odpowiedzi ignorują niebezpieczny problem z ===. Na marginesie zauważono, ale nie podkreślono, że liczby całkowite i podwójne są różnymi typami, więc następujący kod:
daje:
Zauważ, że NIE jest to przypadek „błędu zaokrąglania”. Dwie liczby są dokładnie równe do ostatniego bitu, ale mają różne typy.
Jest to paskudny problem, ponieważ program używający === może z powodzeniem działać przez lata, jeśli wszystkie liczby są wystarczająco małe (gdzie „wystarczająco małe” zależy od sprzętu i systemu operacyjnego, na którym pracujesz). Jeśli jednak przypadkiem liczba całkowita będzie wystarczająco duża, aby przekształcić ją w podwójną, jej typ zostanie zmieniony „na zawsze”, nawet jeśli kolejna operacja lub wiele operacji może przywrócić jej wartość do małej liczby całkowitej. I jest coraz gorzej. Może się rozprzestrzeniać - infekcja podwójności może być przenoszona na wszystko, czego dotknie, jedno obliczenie na raz.
W prawdziwym świecie może to stanowić problem na przykład w programach obsługujących daty po roku 2038. W tej chwili znaczniki czasu UNIX (liczba sekund od 1970-01-01 00:00:00 UTC) będą wymagały więcej niż 32-bitów, więc ich reprezentacja „magicznie” przełączy się na podwojona w niektórych systemach. Dlatego jeśli obliczysz różnicę dwa razy, możesz skończyć z kilkoma sekundami, ale jako podwójną, a nie liczbą całkowitą, która występuje w 2017 roku.
Myślę, że jest to znacznie gorsze niż konwersje między ciągami i liczbami, ponieważ jest subtelne. Śledzenie tego, co jest ciągiem, a co liczbą, jest dla mnie łatwe, ale śledzenie liczby bitów w liczbie jest poza mną.
Tak więc, w powyższych odpowiedziach jest kilka fajnych tabel, ale nie ma rozróżnienia między 1 (jako liczba całkowita) i 1 (subtelne podwójne) i 1.0 (oczywiste podwójne). Również rada, której powinieneś zawsze używać === i nigdy ==, nie jest świetna, ponieważ === czasami zawiedzie, gdy == działa poprawnie. Również JavaScript nie jest pod tym względem równoważny, ponieważ ma tylko jeden typ liczb (wewnętrznie może mieć różne reprezentacje bitowe, ale nie powoduje problemów dla ===).
Moja rada - nie używaj żadnej. Musisz napisać własną funkcję porównania, aby naprawdę naprawić ten bałagan.
źródło
Istnieją dwie różnice między nimi
==
i===
w tablic i obiektów, które moim zdaniem nie wspomnieć tutaj PHP; dwie tablice z różnymi rodzajami kluczy i obiektami.Dwie tablice z różnymi rodzajami kluczy
Jeśli masz tablicę z sortowaniem według klucza i inną tablicę z innym sortowaniem według klucza, są one całkowicie różne (tzn. Używają
===
). Może to spowodować, jeśli posortujesz tablicę kluczem i spróbujesz porównać posortowaną tablicę z oryginalną.Rozważmy na przykład pustą tablicę. Najpierw próbujemy wypchnąć kilka nowych indeksów do tablicy bez żadnego specjalnego rodzaju. Dobrym przykładem może być tablica z ciągami znaków jako kluczami. Teraz głęboko w przykład:
Teraz mamy tablicę nieposortowanych kluczy (np. „On” pojawił się po „tobie”). Rozważ tę samą tablicę, ale posortowaliśmy jej klucze alfabetycznie:
Wskazówka : możesz sortować tablicę według klucza za pomocą ksort () .
Teraz masz inną tablicę z innym rodzajem klucza niż pierwszy. Porównamy je:
Uwaga : Może to być oczywiste, ale zawsze porównanie dwóch różnych tablic przy użyciu ścisłego porównania
false
. Jednak dwie dowolne tablice mogą być równe przy użyciu===
lub nie.Powiedziałbyś: „Ta różnica jest znikoma”. Mówię wtedy, że to różnica, którą należy rozważyć i może się zdarzyć w dowolnym momencie. Jak wspomniano powyżej, sortowanie kluczy w tablicy jest tego dobrym przykładem.
Obiekty
Pamiętaj, że dwa różne obiekty nigdy nie są sobie równe . Te przykłady pomogłyby:
Uwaga : Przypisanie obiektu do innej zmiennej nie tworzy kopii - tworzy raczej odwołanie do tej samej lokalizacji pamięci co obiekt. Spójrz tutaj .
Uwaga : Od PHP7 dodano anonimowe klasy . Z wyników, nie ma różnicy między
new class {}
inew stdClass()
w testach powyżej.źródło