2010-06-21 7 views
9

Heute habe ich nur bemerkt und herausgefunden, die Bedeutung der Verwendung von === Betreiber. Sie können es im folgenden Beispiel sehen:Die Bedeutung von === statt == in PHP!

$var=0; 
if ($var==false) echo "true"; else echo "false"; //prints true 
$var=false; 
if ($var==false) echo "true"; else echo "false"; //prints true 
$var=0; 
if ($var===false) echo "true"; else echo "false"; //prints false 
$var=false; 
if ($var===false) echo "true"; else echo "false"; //prints true 

Die Frage ist, dass, gibt es Situationen, in denen es wichtig === Operator statt mit == Operator zu verwenden ist?

+4

Sie nur 'echo $ var sagen könnte == false;' usw. – Skilldrick

+1

Siehe http://stackoverflow.com/questions/1117967/was-ist-gemein – ChrisF

+0

@Chris. Ich habe mir diese Frage schon angesehen. Aber meine Frage bezieht sich auf Beispiele, bei denen es wirklich wichtig ist, den Operator "===" und nicht den Operator "==" zu verwenden. – Bakhtiyor

Antwort

13

Natürlich nur ein Beispiel: array_search()

Warnung

Diese Funktion zurückgeben kann Boolean FALSE, kann aber auch einen nicht-Booleschen Wert zurück, der FALSE auswertet, wie 0 oder "". Bitte lesen Sie den Abschnitt über Boolesche Informationen für weitere Informationen. Verwenden Sie den Operator === zum Testen des Rückgabewerts dieser Funktion.

Grundsätzlich, wenn Sie irgendeine Funktion zu verwenden, dass Wert auf Erfolg gibt aber FALSE bei Ausfall, sollten Sie das Ergebnis mit === überprüfen, um sicher zu sein (warum sonst würde es ein großes rotes Warnfeld sein;))


Weitere Beispiele: next(), current()
oder wie erwähnt String-Funktionen auch als strpos(), stripos() usw.

Auch substr() obwohl es nicht ausdrücklich erwähnt wird:

Gibt den extrahierten Teil des String oder FALSE.

Aber was ist, wenn der extrahierte Teil "0" ist? Es wird auch FALSE ausgewertet, aber es ist kein Fehler.

+1

'next' und' current' sind keine guten Beispiele. Was ist, wenn es * falsche * Werte wie in 'array (false)' gibt? – Gumbo

+1

@Gumbo: Das stimmt. Ich habe sie nur erwähnt, weil sie in ihrer Dokumentation auch dieses Warnfeld haben. Aber es gibt eine Notiz (die imho mehr betont werden sollte): * Hinweis: Sie können das Ende eines Arrays nicht von einem booleschen FALSE-Element unterscheiden. Um ein Array, das FALSE Elemente enthalten kann, zu durchlaufen, sehen Sie sich die Funktion each() an. * –

3

Der === ist strict type comparison Operator, wird es nicht nur überprüfen Werte sondern auch ihre Typ während == nur überprüft, ob oder nicht Werte gleich sind.

eine Situation betrachtet, wenn Sie Zahlen oder Strings vergleichen:

if (4 === 4) // same type and value 
{ 
    // true 
} 

aber

if (4 == "4") // same value but different type 
{ 
    // true 
} 

und

if (4 === "4") // same value but different type 
{ 
    // false 
} 

So in diesen Fällen müssen Sie vernünftige Wahl treffen ob zu verwenden == oder ===

+0

Ja, das wusste ich. Aber ich möchte Beispiele finden, bei denen es wichtig ist, einen Operator anstelle eines anderen zu verwenden. – Bakhtiyor

+0

Schauen Sie sich zum Beispiel die Antwort von Felix Kling an. Er hat verstanden was ich will. – Bakhtiyor

+0

@Bakhtiyor: Wie Sie in meinem Beispiel sehen können, ist dies auch nützlich, wenn Sie Zahlen und Strings vergleichen :) – Sarfraz

2

Der Operator === prüft sowohl Typ als auch Wertgleichheit.

Deshalb gibt 0 === false nicht wahr zurück, da sie nicht vom gleichen Typ sind.

6

In strpos() haben Sie 0, wenn Zeichenfolge gefunden wird, und false, wenn falsch ist. Sie müssen === verwenden, um den Unterschied zu überprüfen.

0

Ich habe kürzlich selbst in dieses Problem geraten, als ich einen schnellen SQL-Abfrageparser schrieb. Um die Geschichte kurz zu machen, habe ich die zitierten Parameter mit ihren Platzhaltern verglichen. Grundsätzlich führte der folgende Code mich zu einigen harten Debugging-mal (das Beispiel ist natürlich vereinfacht)

$var = 0; // This is supplied dynamically 

$someCondition = $var == '?'; 

$someCondition endete als wahr die ganze Zeit. Shiver

Grundsätzlich kann jede nicht-strikten (==) <int> == <Zeichenfolge> Vergleich bewirkt, dass die Zeichenfolge in eine ganze Zahl gegossen werden. Abhängig von der Eingabe kann dies als 0 oder der int-Wert des Strings enden, wenn es einen hat, auch wenn der ganze String nicht vollständig numerisch ist.

1

strpos ($ nadel, $ haystack) und verwandte Funktionen geben false zurück, wenn $ nadel nicht in $ haystack existiert, und 0 wenn $ nadel das erste Zeichen von $ haystack ist; und es gibt eine ganze Reihe ähnlicher Funktionen. Die Verwendung von == kann in diesem Fall zu falschen Ergebnissen führen, daher sollten Sie immer === verwenden. Das Handbuch verdeutlicht, wo dies notwendig ist.

6

Wählen Sie immer === über ==, außer dass Sie absolut sicher sind, dass Sie == benötigen, da == nicht transitiv ist. Und das wiederum ist wichtig für Ihre Überlegungen zu Ihrem Code.

Betrachten Sie den folgenden Code

if ($a == $b && $b == $c) { 
    // [1] assert: $a == $c 
} 

Jeder aus dem, wenn die Bedingung würde folgern Snippet, dass die Behauptung $a == $c wahr ist, weil wir auf die Gleichheitsbeziehung zu sein transitiv so verwendet werden. Aber das gilt nicht für ==, Gegenbeispiel:

$a = "0"; 
$b = 0; 
$c = null; 

Jetzt darüber nachdenken, wie oft machen wir (manchmal unbewusst) diese Annahme beim Schreiben von Code. Das könnte zu ernsthaften Fehlern führen.

3

Ein gutes Beispiel, wo Sie in Schwierigkeiten geraten kann 0 und eine Zeichenfolge vergleicht, fx

if (0 == 'completed') { 
    // evaluates as TRUE 
} 

Ein String nicht mit einer Zahl beginnen wird 0 wenn sie in einen int umgewandelt. Dies kann zu einem Problem werden, wenn ein Status, der 0 sein kann, mit einer Zeichenfolge verglichen wird.

0

Wenn Sie zwei numerische Zeichenfolgen vergleichen, werden sie als ganze Zahlen verglichen.1

var_dump("15" == "0xF"); // TRUE 
var_dump("15" === "0xF"); // FALSE 

und TRUE ist indirekt gleich FALSCH 2

$a = 0; 
$b = 'x'; 
var_dump(FALSE == $a); // TRUE 
var_dump($a == $b); // TRUE 
var_dump($b == TRUE); // TRUE 
var_dump(FALSE === $a); // FALSE 
var_dump($a === $b); // FALSE 
var_dump($b === TRUE); // FALSE