Die 3 verschiedenen sind gleich

149

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

Ich denke, ein Gleichheitszeichen bedeutet, eine Variable zu deklarieren, während zwei Gleichheitszeichen für eine Vergleichsbedingung und schließlich drei Gleichheitszeichen für den Vergleich von Werten deklarierter Variablen dienen.

Erdbeere
quelle
Schauen
1
Für fortgeschrittene PHP-Benutzer, die den Unterschied zwischen == und === kennen und sich fragen: "Ist es schneller, mit == oder mit === zu vergleichen, wenn ich sicher bin, dass beide Operanden vom gleichen Typ sind?", Schauen Sie bitte nach in meinem Benchmark-Skript unten.
Lucaferrario
@Strawberry Ich denke, das Tag der Frage sollte auch das Javascript- Tag enthalten, da es auch für diese Sprache gilt.
Funk Forty Niner
(Update): Ich habe das Javascript-Tag in einer Bearbeitung hinzugefügt, da es einige Fragen gab, bei denen Leute =Javascript verwendeten. Das gilt nicht nur für PHP, sondern auch für andere Sprachen.
Funk Forty Niner
Ich habe das JavaScript-Tag gelöscht: Alle Antworten hier beziehen sich nur auf PHP (mit Ausnahme der neuesten, die sehr schwach ist), es gibt Unterschiede zwischen der Handhabung der Sprachen und es gibt bereits eine ähnliche de facto kanonische JavaScript-Frage ( welche gleich ist) Operator (== vs ===) sollte in JavaScript-Vergleichen verwendet werden? ).
JJJ

Antworten:

172

Sie haben =den Zuweisungsoperator , ==den Vergleichsoperator 'gleich' und ===den Vergleichsoperator 'identisch' .

$a = $b     Assign      Sets $a to be equal to $b.
$a == $b    Equal       TRUE if $a is equal to $b.
$a === $b   Identical   TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)

Weitere Informationen zur Notwendigkeit ==und ===zu den jeweiligen Situationen finden Sie in den Dokumenten .

Zwerg
quelle
Wenn ich zwei identische Datums- / Uhrzeitangaben vergleiche, habe ich ein falsches Ergebnis. Warum? Beispiel: sandbox.onlinephpfunctions.com/code/…
stloc
3
@stloc, ===mit Objekten sagt Ihnen, ob sie das gleiche Objekt sind, nicht, ob sie den gleichen Inhalt haben.
Andrea
Eingeführt in PHP4, lustig in Y2018 ;-)
mvorisek
22
  • = ist der Zuweisungsoperator
  • == ist der Vergleichsoperator (prüft, ob zwei Variablen gleiche Werte haben)
  • === ist der identische Vergleichsoperator (prüft, ob zwei Variablen gleiche Werte haben und vom gleichen Typ sind).
Rich Adams
quelle
8

= Zuweisungsoperator

== prüft, ob zwei Variablen den gleichen Wert haben

=== prüft, ob zwei Variablen den gleichen Wert haben UND ob ihre Typen gleich sind

Silvio Donnini
quelle
1
Kennen Sie auch die Versionen! = Und! == 'not' der beiden Vergleichsoperatoren. Einige Sprachen verwenden: = als Zuordnung, um diese Art von Verwirrung zu vermeiden.
Phil Perry
3

Der Operator = weist den Wert einer Variablen zu. $ Six = 6; Der Wert 6 wird der Variablen $ six zugewiesen

== Operator prüft, ob der Wert beider Variablen gleich ist und meistens unter Bedingungen wie if-Anweisungen verwendet wird

$a = 2;
$b = 2;
if ($a == $b) { 
    echo both variables have the same value; 
}

=== Operator ähnlich == (prüfen Sie, ob der Wert gleich ist) und ob beide denselben Datentyp haben

$a = 2;
$b = "2";
if ($a === $b) {
    echo "both variable have same value and of same data type";
} else {
    echo 'both variable is either not equal or not of same data type';
}

// hier ist $ a vom Typ int, während $ b vom Typ string ist. Also hier die Ausgabe

Gideon Babu
quelle
0

Für fortgeschrittene PHP-Benutzer, die den Unterschied zwischen ==und kennen ===und sich fragen: "Ist es schneller, mit ==oder zu vergleichen, ===wenn ich sicher bin, dass beide Operanden vom gleichen Typ sind?"

Die kurze und allgemeine Antwort lautet: In diesen Fällen gibt es keinen Leistungsgewinn bei der Verwendung ===, daher sollten Sie wahrscheinlich verwenden ==.

Für diejenigen, die daran interessiert sind, es selbst zu vergleichen, können Sie den folgenden Code verwenden, den ich ad-hoc geschrieben habe, und verschiedene Werte für $aund ausprobieren $b:

<?php
    // CONFIGURATION
    $cycles = 1000000;
    $a = 'random string 1';
    $b = 'random string 2';

    // FUNCTIONS
    function compare_two_equals($a, $b) {
        if ($a == $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    function compare_three_equals($a, $b) {
        if ($a === $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    // EXECUTION
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);

    // RESULTS PRINTING
    print "<br />\nCOMPARE == (FIRST TRY): " . number_format($time_two_a, 3) . " seconds";
    print "<br />\nCOMPARE == (SECOND TRY): " . number_format($time_two_b, 3) . " seconds";
    print "<br />\nCOMPARE === (FIRST TRY): " . number_format($time_three_a, 3) . " seconds";
    print "<br />\nCOMPARE === (SECOND TRY): " . number_format($time_three_b, 3) . " seconds";
?>

HINWEIS: Der Vergleich ist nur gültig, wenn jeder "ERSTE VERSUCH" seinem "ZWEITEN VERSUCH" sehr nahe kommt. Wenn sie sich erheblich unterscheiden, bedeutet dies, dass der Prozessor während der Ausführung der Vergleiche etwas anderes getan hat. Daher sind die Ergebnisse unzuverlässig und der Benchmark sollte erneut ausgeführt werden.

lucaferrario
quelle
9
Solche Mikrobenchmarks sind nicht sehr zuverlässig. Es ist auch höchst unwahrscheinlich, dass Sie sich jemals Sorgen machen ==oder ===die Ursache für Ihr Leistungsproblem sein möchten . IMO: Es ist besser, streng ( ===) zu sein, es sei denn, Sie möchten explizit locker ( ==) über Ihre Vergleiche sein. Die Anzahl der seltsamen "5 is not a number" == 5Randfälle kann zu verrückten Fehlern führen. ===leidet nie unter diesem Problem.
Gnarf
Mein Test bestand darin, Programmierern mitzuteilen, dass ===sie falsch liegen , wenn sie sich aus Leistungsgründen entscheiden. Programmierer können also frei wählen ===oder ==aus logischen Gründen, aber nicht aus Leistungsgründen: Es gibt verschiedene Fälle, in denen sie den einen oder anderen bevorzugen, und die Leistung darf überhaupt nicht berücksichtigt werden.
Lucaferrario