Wie unterscheiden sich die Vergleichsoperatoren PHP-Gleichheit (== doppelt gleich) und Identität (=== dreifach gleich)?


Answers

Der Operator == wirft zwischen zwei verschiedenen Typen um, wenn diese verschieden sind, während der Operator === einen 'typsicheren Vergleich' durchführt. Das heißt, es wird nur dann true zurückgegeben, wenn beide Operanden den gleichen Typ und den gleichen Wert haben.

Beispiele:

1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value

Warnung : Zwei Instanzen der gleichen Klasse mit entsprechenden === stimmen NICHT mit dem Operator === . Beispiel:

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Question

Was ist der Unterschied zwischen == und === ?

  • Wie genau funktioniert der lose == Vergleich?
  • Wie genau funktioniert der strenge Vergleich?

Was wären einige nützliche Beispiele?




fwrite() zum Beispiel die Funktion fwrite() in PHP, wenn Sie eins über das andere verwenden wollen.

Diese Funktion schreibt den Inhalt in einen Dateistream. Laut PHP gibt " fwrite() die Anzahl der geschriebenen Bytes zurück oder FALSE bei einem Fehler." Wenn Sie testen möchten, ob der Funktionsaufruf erfolgreich war, ist diese Methode fehlerhaft:

if (!fwrite(stuff))
{
    log('error!');
}

Es kann Null zurückgeben (und gilt als erfolgreich), und Ihre Bedingung wird trotzdem ausgelöst. Der richtige Weg wäre:

if (fwrite(stuff) === FALSE)
{
    log('error!');
}



$a = 5;   // 5 as an integer

var_dump($a == 5);       // compare value; return true
var_dump($a == '5');     // compare value (ignore type); return true
var_dump($a === 5);      // compare type/value (integer vs. integer); return true
var_dump($a === '5');    // compare type/value (integer vs. string); return false

Sei aber vorsichtig. Hier ist ein notorisches Problem.

// 'test' is found at position 0, which is interpreted as the boolean 'false'
if (strpos('testing', 'test')) {
    // code...
}

vs.

// true, as strict comparison was made (0 !== false)
if (strpos('testing', 'test') !== false) {
    // code...
}



In einfachsten Worten:

== prüft ob äquivalent (nur Wert)

=== prüft ob das gleiche ist (Wert && Typ)


Äquivalent vs. Same: Eine Analogie

1 + 1 = 2 + 0 (gleichwertig)

1 + 1 = 1 + 1 (gleich)


In PHP:

true == 1 (true - Wertäquivalent)

true === 1 (falsch - nicht gleich im Wert && type)

  • Wahr ist Boolesch
  • 1 ist int



PHP ist eine locker getippte Sprache. Die Verwendung des doppelten Gleichheitsoperators ermöglicht eine lose Überprüfung einer Variablen.

Wenn Sie einen Wert locker prüfen, können Sie einige ähnliche, aber nicht gleiche Werte gleichsetzen:

  • ''
  • Null
  • falsch
  • 0

Alle diese Werte würden mit dem double equal-Operator gleichgesetzt.




Nur wenige der Beispiele

var_dump(5 == 5);    // True
var_dump(5 == "5");  // True because == checks only same value not type
var_dump(5 === 5);   // True
var_dump(5 === "5"); // False because value are same but data type are different.

PS

== Vergleicht nur den Wert, es wird sich nicht um die Datentypen kümmern

vs.

=== Vergleicht die Werte und Datentypen




Der Operator === soll die genaue Inhaltsgleichheit vergleichen, während der Operator == die semantische Gleichheit vergleicht. Insbesondere wird es Strings zu Zahlen zwingen.

Gleichheit ist ein großes Thema. Siehe den Wikipedia-Artikel über Gleichheit .




Ein Beispiel dafür ist, dass ein Datenbankattribut null oder "" sein kann:

$attributeFromArray = "";
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //true
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //false

$attributeFromArray = null;
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //false
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //true



Ein Bild sagt mehr als tausend Worte:

PHP Double Equals == Gleichheitsdiagramm:

PHP Triple Equals === Gleichheitsdiagramm:

Quellcode zum Erstellen dieser Bilder:

https://github.com/sentientmachine/php_equality_charts

Guru Meditation

Diejenigen, die ihren Verstand behalten wollen, lesen nicht weiter.

  1. '==' konvertiert linke und rechte Operanden in Zahlen, wenn möglich (123 == "123foo", aber "123"! = "123foo"
  2. Ein Hex-String in Anführungszeichen ist gelegentlich ein Float und wird gegen Ihren Willen darauf geworfen.
  3. == ist nicht transitiv, weil ("0" ist == bis 0, und 0 ist == bis "", aber "0"! = "")
  4. "6" == "6", "4.2" == "4.20" und "133" == "0133". Aber 133! = 0133, weil 0133 oktal ist. Aber "0x10" == "16" und "1e3" == "1000"
  5. PHP-Variablen, die noch nicht deklariert wurden, sind falsch.

  6. False ist gleich 0, Blankstring und leeres Array und "0".

  7. Wenn Zahlen groß genug sind, sind sie == Infinity.
  8. NAN ist nicht selbst, aber es ist wahr.

  9. Eine frische Klasse ist == bis 1.

  10. Falsch ist der gefährlichste Wert, weil False == für die meisten anderen Variablen gilt.

Hoffnung:

Wenn Sie PHP verwenden, sollten Sie den double equals -Operator nicht verwenden. Verwenden Sie immer triple equals.