2009-08-15 4 views
0

Ich weiß, dass zum Beispiel mit:Sollte man strikten Vergleich in Strings verwenden?

if (in_array('...'), array('.', '..', '...') === true) 

Over:

if (in_array('...'), array('.', '..', '...') == true) 

Leistung erhöhen und einige häufige Fehler (wie 1 == true) zu vermeiden, aber wenn ich mich frage, da ist ein Grund, strenge Vergleiche auf Zeichenketten zu verwenden, wie zum Beispiel:

if ('...' === '...') 

scheint das genau gleiche wie zu tun:

if ('...' == '...') 

Wenn jemand etwas Licht auf dieses Thema bringen kann er es zu schätzen wissen.

Antwort

6

Wenn Sie beide Werte kennen garantiert Strings sein, dann == und === identisch sind, da der einzige Unterschied zwischen den beiden ist, dass === überprüft, ob die Typen die gleichen, nicht nur die effektiven Werte sind.

jedoch in einigen Fällen Sie wissen nicht sicher, dass ein Wert eine Zeichenfolge sein wird - zum Beispiel, mit Dingen wie das _GET und $ _POST $ Variablen. Beachten Sie Folgendes:

$_GET['foo'] == "" 

Der obige Ausdruck zu true ausgewertet wird, wenn foo wurde als eine leere Zeichenfolge übergeben, aber es wird auch den Wert true, wenn wurde kein Wert für foo an allen eingeleitet. Im Gegensatz dazu

$_GET['foo'] === "" 

nur zu wahr ausgewertet wird, wenn eine leere Zeichenfolge explizit übergeben wurde - andernfalls wird der Wert von $_GET['foo'] könnte auf eine leere Zeichenfolge entsprechen, aber der Typ wäre nicht, da es eigentlich ein leer sein würde Wert für diesen Index, keine Zeichenfolge.

+1

In Ihrem Beispiel, wenn überhaupt kein Wert an 'foo' übergeben wurde, erhalten Sie einen PHP E_NOTICE-Level-Fehler. –

+0

Hab es, danke. –

3

Wenn Sie eine oder das andere wählen die strenge Vergleich verwenden können, weil:

  1. Es bessere Leistung hat
  2. Es unerwartete Ergebnisse verhindert

Wenn Strings vergleichen Sie noch zu unerwarteten Ergebnissen führen kann weil eine Zeichenkette leer sein könnte oder eine Variable, von der Sie denken, dass sie eine Zeichenkette ist, nicht.

Sie würden nie den Vergleich von zwei Zeichenketten verwenden, weil es immer auf WAHR oder FALSCH reduziert werden kann. Zum Beispiel:

if ('...' === '...') 

ist die gleiche wie

if (TRUE) 

So, da Sie immer mindestens eine Variable sein zu vergleichen, müssen Sie davon ausgehen, dass Sie zu unerwarteten Ergebnissen führen kann.

Sie können http://net-beta.net/ubench/ Benchmark-Ergebnisse verschiedener streng gegen lose Vergleiche sehen. Ich habe auch meine eigenen Tests durchgeführt und die gleichen Ergebnisse gefunden.

Dies ist eine Mikrooptimierung, was bedeutet, dass Sie den vorhandenen Code nicht ändern sollten, weil er keinen spürbaren Unterschied macht. Wenn Sie jedoch neuen Code schreiben, können Sie auch die effizientesten Techniken anwenden.

+0

Danke. BTW, diese Tests http://net-beta.net/ubench/index.php?t=array10 scheint nicht gleichwertig zu sein. Sie betreiben diese Website? –

+0

Die Website ist eine Referenz. Ich lasse es nicht laufen. [net-beta.net/ubench/](http://net-beta.net/ubench/) ist eine Sammlung verschiedener Benchmarks. Wenn Sie nach unten auf gleich1 - gleich 7 scrollen, finden Sie die Vergleichstests. Leider gibt es auf der gesamten Seite keine IDs oder benannten Anker, so dass ich mich nicht spezifisch mit der Gruppe der Tests verbinden kann. –