Wie unterscheiden sich die Vergleichsoperatoren PHP-Gleichheit (== Doppel gleich) und Identität (=== Dreifach gleich)?
Was ist der Unterschied zwischen ==
und ===
?
- Wie genau funktioniert das lose
==
Vergleich arbeiten? - Wie genau funktioniert die strenge
===
Vergleich arbeiten?
Was würde werden einige nützliche Beispiele?
Kommentar zu dem Problem
InformationsquelleAutor der Frage nickf | 2008-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unterschied zwischen
==
und===
Den Unterschied zwischen den lose
==
gleich-operator und die strenge===
identische operator ist genau beschrieben, in der Handbuch:Locker
==
gleich VergleichWenn Sie die
==
Betreiber oder andere Vergleichsmethode, die verwendet lose-Vergleich wie!=
,<>
oder==
haben Sie immer den Blick auf die Kontext, um zu sehen, was, wo und warum etwas umgewandelt wird, zu verstehen, was Los ist.Umwandlung von Regeln
Art Vergleichstabelle
Als Referenz und Beispiel Sie können finden Sie in der Vergleichstabelle in der Handbuch:
Strengen
===
identisch VergleichWenn Sie die
===
Betreiber oder andere Vergleichsmethode, die verwendet strengen Vergleich wie!==
oder===
, dann können Sie immer sicher sein, dass die Typen nicht magisch ändern, denn es wird keine Konvertierung geht. So strengen Vergleich die Art und den Wert gleich zu sein haben, nicht nur den Wert.Art Vergleichstabelle
Als Referenz und Beispiel Sie können finden Sie in der Vergleichstabelle in der Handbuch:
InformationsquelleAutor der Antwort nickf
Den operator == CASTET zwischen zwei verschiedenen Typen, wenn Sie unterschiedlich sind, während die = = = - operator führt eine 'typesafe-Vergleich'. Das heißt, es wird nur true zurückgegeben, wenn beide Operanden den gleichen Typ und den gleichen Wert.
Beispiele:
Warnung: zwei Instanzen der gleichen Klasse mit gleichwertigen Mitgliedern, die NICHT mit den
===
Betreiber. Beispiel:InformationsquelleAutor der Antwort Patrick Glandien
In Bezug auf JavaScript:
Den === operator funktioniert genauso wie der = = - operator, aber es erfordert, dass seine Operanden haben nicht nur den gleichen Wert, aber auch den gleichen Datentyp.
Zum Beispiel das Beispiel unten zeigt 'x und y sind gleich', aber nicht 'x und y sind identisch'.
InformationsquelleAutor der Antwort
Ein Bild sagt mehr als tausend Worte:
PHP Doppel-Entspricht
==
Gleichheit Diagramm:PHP Dreifach Gleich
===
Gleichheit Diagramm:Source code zum erstellen der Bilder:
https://github.com/sentientmachine/php_equality_charts
Guru Meditation
Diejenigen, die wollen, halten Sie Ihre geistige Gesundheit haben, Lesen Sie nicht weiter.
PHP-Variablen, die nicht erklärt wurden, noch falsch sind.
False ist gleich 0, blankstring und leeres array, und "0".
NAN nicht == selbst, aber es ist Wahr.
Einer frischen Klasse ist == 1.
Hoffnung:
Wenn Sie mit PHP, sollst Du Sie nicht verwenden die Doppel-ist-gleich-operator, verwenden Sie immer triple entspricht.
InformationsquelleAutor der Antwort Eric Leschinski
Ergänzung zu den anderen Antworten in Bezug auf das Objekt-Vergleich:
== vergleicht bei Objekten mit dem Namen des Objekts und deren Werte. Wenn zwei Objekte den gleichen Typ und die gleichen member-Werte,
$a == $b
ergibt true.=== vergleicht die interne Objekt-id der Objekte. Auch wenn die Mitglieder gleich sind,
$a !== $b
wenn Sie nicht genau das gleiche Objekt.InformationsquelleAutor der Antwort soulmerge
In einfachen Worten:
== prüft, ob entspricht (Wert nur)
=== prüft, ob die gleichen (value && Typ)
Äquivalent vs. Gleiche: Eine Analogie
1 + 1 = 2 + 0 (äquivalent)
1 + 1 = 1 + 1 (gleichen)
In PHP:
true == 1 (true - Gegenwert)
true === 1 (false - nicht den gleichen Wert && Typ)
InformationsquelleAutor der Antwort silver
Es ist alles über Datentypen. Nehmen Sie ein
BOOL
(true oder false) Beispiel:true
auch gleich1
undfalse
auch gleich0
Den
==
kümmert sich nicht um die Datentypen beim Vergleich:Also, wenn Sie hatte eine variable, die 1 ist (und das kann auch
true
):$var=1;
Vergleichen und dann mit der
==
:Aber
$var
eigentlich nicht gleichtrue
tut es? Es hat den int-Wert von1
statt, die wiederum, ist gleich wahr.Mit
===
werden die Datentypen überprüft, um sicherzustellen, dass die zwei Variablen/Objekte/was auch immer sind mit dem gleichen Typ.So, wenn ich
dass die Bedingung nicht wahr sein, wie
$var !== true
es nur== true
(wenn Ihr wisst was ich meine).Warum würden Sie brauchen?
Einfach - lassen Sie uns nehmen einen Blick auf eine der PHP-Funktionen:
array_search()
:Den
array_search()
Funktion einfach sucht einen Wert in einem array, und gibt den Schlüssel des Elements der Wert gefunden wurde. Wenn der Wert konnte nicht im array gefunden wird, gibt es false. Was aber, wenn Sie haben einenarray_search()
auf einen Wert, der gespeichert wurde, in die erste element des Arrays (das wäre die array-Schlüssel von0
)....diearray_search()
hätte, würde die Funktion 0 zurück...das ist gleich false..Also, wenn Sie haben:
So, sehen Sie, wie das könnte ein Problem sein jetzt?
Meisten Menschen nicht verwenden
== false
bei der Prüfung, ob eine Funktion den Wert false zurückgibt. Stattdessen nutzen Sie die!
. Aber eigentlich ist das genau das gleiche wie mit==false
, so dass, wenn Sie haben:Also für Dinge wie, dass, Sie verwenden die
===
statt, so dass der Datentyp überprüft.InformationsquelleAutor der Antwort
Ein Beispiel ist, dass eine Datenbank-Attribut kann null oder "":
InformationsquelleAutor der Antwort fico7489
Gegeben
x = 5
1) Operator: = = ("gleich").
x == 8
false2) Operator : === ist "genau gleich" (Wert und Typ)
x === 5
ist wahr,x === "5"
ist falschInformationsquelleAutor der Antwort Mannusanghi
Aber vorsichtig sein. Hier ist ein notorisches problem.
vs.
InformationsquelleAutor der Antwort Seph
Kurz gesagt, === funktioniert in der gleichen Weise, = = bedeutet in den meisten anderen Programmiersprachen.
PHP ermöglicht es Ihnen, Vergleiche anzustellen, die nicht wirklich Sinn machen. Beispiel:
Während dieser erlaubt es für einige interessante "shortcuts" sollten Sie sich hüten, da eine Funktion, die etwas zurückgibt, sollte es nicht (wie "error", statt einer Nummer) wird man nicht erwischt, und Sie werden sich Fragen, was passiert ist.
In PHP, == vergleicht Werte und führt eine Typkonvertierung, wenn notwendig (zum Beispiel die Zeichenfolge "12343sdfjskfjds" wird zu "12343" in einem integer-Vergleich). === vergleichen Sie den Wert UND den Typ und den Wert false zurück, wenn der Typ nicht das gleiche.
Wenn Sie einen Blick in das PHP-Handbuch werden Sie sehen, dass eine Menge von Funktionen return "false", wenn die Funktion fehlschlägt, aber Sie könnten return 0 in einem erfolgreichen Szenario, das ist, warum Sie empfehlen, tun ", wenn (function() !== false)", um Fehler zu vermeiden.
InformationsquelleAutor der Antwort Christian P.
Einige Beispiele
P. S.
vs.
InformationsquelleAutor der Antwort Mohit Tanwani
Verwenden Sie === testen, ob eine Funktion oder eine variable falsch ist, anstatt einfach was falsch (null oder ein leerer string).
In diesem Fall strpos würde 0 zurückgeben, das wäre gleichzusetzen mit false im test
oder
ist nicht das, was Sie hier wollen.
InformationsquelleAutor der Antwort Stacey Richards
Als zum Zeitpunkt der Verwendung eine über der anderen, nehmen Sie zum Beispiel die
fwrite()
- Funktion in PHP.Diese Funktion schreibt Inhalt in eine Datei streamen. Laut PHP, "
fwrite()
gibt die Anzahl der geschriebenen bytes oder FALSE on error.". Wenn Sie möchten, um zu testen, ob der Funktionsaufruf erfolgreich war, ist diese Methode fehlerhaft:Kann null zurückgeben (und als erfolgreich betrachtet werden kann), und Ihr Zustand wird immer noch ausgelöst. Der richtige Weg wäre:
InformationsquelleAutor der Antwort Mario
PHP ist eine schwach typisierte Sprache. Mit der Doppel-gleich-operator können Sie für eine lockere überprüfung einer variable.
Locker einen Wert überprüfen erlauben würde, für eine ähnliche, aber nicht gleiche Werte gleichsetzen, als die gleiche:
Alle diese Werte ergäben sich als gleich mit dem Doppel-gleich-operator.
InformationsquelleAutor der Antwort Cory Collier
Variablen haben einen Typ und einen Wert.
Wenn Sie diese Variablen verwenden (in PHP), manchmal haben Sie nicht die gute Art.
Zum Beispiel, wenn Sie
PHP zu konvertieren ("casten") $var, integer. In diesem Fall, "$var == 1" wahr ist, weil jede nicht-leere Zeichenfolge wird gegossen, um 1.
Bei Verwendung von = = = überprüfen Sie, dass der Wert UND TYP gleich sind, also "$var === 1" ist falsch.
Dies ist zum Beispiel nützlich, wenn Sie haben eine Funktion kann false zurückgeben (auf Fehler) und 0 (Ergebnis) :
Dieser code ist falsch, wie wenn
myFunction()
gibt 0 zurück, es wird gegossen, auf false, und Sie scheinen zu haben, einen Fehler. Der richtige code lautet :wegen dem test ist, dass der Rückgabewert "ist ein boolescher Wert, der falsch ist" und nicht "kann werden gegossen auf "false".
InformationsquelleAutor der Antwort ofaurax
Den
===
Betreiber soll vergleichen genaue Inhalt der Geschlechter während der==
- Betreiber vergleichen semantische Gleichheit. Sie wird insbesondere die nötigen strings in zahlen.Gleichberechtigung ist ein großes Thema. Sehen der Wikipedia-Artikel auf der Gleichheit.
InformationsquelleAutor der Antwort kmkaplan
InformationsquelleAutor der Antwort Sathish
Alle Antworten bisher ignorieren gefährliches problem mit ===. Es wurde festgestellt, dass im Vorbeigehen, aber nicht gestresst sind, dass Sie integer und double sind verschiedene Arten, so dass Sie den folgenden code:
gibt:
Beachten Sie, dass dies NICHT ein Fall von ein "Rundungsfehler". Die zwei zahlen sind genau gleich, bis auf das Letzte bit, aber Sie haben unterschiedliche Typen.
Dies ist ein unangenehmes problem, da ein Programm mit === kann ausgeführt werden glücklich für Jahre, wenn alle zahlen sind klein genug (wobei "klein genug" ist, hängt von der hardware und Betriebssystem, das Sie ausgeführt werden). Allerdings, wenn zufällig eine Ganzzahl passiert, groß genug sein, um umgewandelt werden, um eine doppelte, seinen Typ geändert "für immer", obwohl eine nachfolgende operation oder mehrere Operationen, möglicherweise bringen Sie zurück, um einen kleinen integer-Wert. Und, es kommt noch schlimmer. Es können sich ausbreiten - Doppel-ness-Infektion kann vorwärts, um alles, was es berührt, eine Berechnung zu einem Zeitpunkt.
In der realen Welt, dies ist wahrscheinlich ein problem in den Programmen, die mit Daten jenseits des Jahres 2038, zum Beispiel. Zu dieser Zeit UNIX-Zeitstempel (Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC) erfordert mehr als 32 bits, so Ihre Darstellung, "magisch" - Schalter zu verdoppeln auf einigen Systemen. Also, wenn Sie berechnen die Differenz zwischen zwei Zeiten, die Sie könnten am Ende mit ein paar Sekunden, aber als Doppel -, sondern als die integer-Ergebnis, das Auftritt, im Jahr 2017.
Ich denke, das ist viel schlimmer als die Konvertierungen zwischen strings und zahlen, denn es ist subtil. Ich finde es einfach zu halten Spur von dem, was ist ein string, was ist eine Zahl, aber den überblick über die Zahl der bits in einer Zahl ist mir schleierhaft.
So, in der oben genannten Antworten gibt es einige schöne Tische, aber keine Unterscheidung zwischen 1 (als Ganzzahl) und 1 (subtile Doppel) und 1.0 (offensichtlich doppelt). Auch die Beratung, dass Sie sollten verwenden Sie immer === und nie == ist nicht toll, weil === wird manchmal nicht wo == funktioniert einwandfrei. Auch JavaScript ist nicht gleichwertig in dieser Hinsicht, weil es nur eine Zahl geben (intern es können unterschiedliche bit-Weise zusagen, aber es muss nicht zu Problemen führen,===).
Mein Rat - verwenden Sie weder. Sie müssen schreiben Sie Ihre eigenen Vergleich-Funktion zum beheben dieses Chaos.
InformationsquelleAutor der Antwort DavidWalley