3 Stimmen

Sollte man Strict Comparison in Strings verwenden?

Ich weiß, dass zum Beispiel die Verwendung von:

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

Ende:

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

Kann die Leistung erhöhen und einige häufige Fehler vermeiden (wie 1 == true), aber ich frage mich, ob es einen Grund gibt, strenge Vergleiche auf Zeichenfolgen zu verwenden, wie z. B.:

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

Scheint genau das Gleiche zu tun wie:

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

Wenn jemand etwas Licht in dieses Thema bringen kann, wäre ich dankbar.

7voto

Amber Punkte 473552

Wenn Sie wissen, dass es sich bei beiden Werten garantiert um Zeichenketten handelt, dann == et === sind identisch, da der einzige Unterschied zwischen den beiden darin besteht, dass === prüft, ob die Typen gleich sind, nicht nur die effektiven Werte.

In einigen Fällen weiß man jedoch nicht sicher, dass ein Wert eine Zeichenkette sein wird - zum Beispiel bei Variablen wie $_GET und $_POST. Betrachten Sie das Folgende:

$_GET['foo'] == ""

Der obige Ausdruck wird als wahr ausgewertet, wenn foo als leere Zeichenkette übergeben wurde, aber es wird auch als wahr ausgewertet, wenn kein Wert übergeben wurde für foo überhaupt . Im Gegensatz dazu,

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

wird nur als wahr ausgewertet, wenn explizit eine leere Zeichenkette übergeben wurde - andernfalls wird der Wert von $_GET['foo'] könnte einer leeren Zeichenkette entsprechen, aber der Typ wäre es nicht, da es sich um einen leeren Wert für diesen Index und nicht um eine Zeichenkette handeln würde.

1 Stimmen

Wenn in Ihrem Beispiel überhaupt kein Wert an 'foo' übergeben wurde, würden Sie einen PHP-Fehler der Stufe E_NOTICE erhalten.

0 Stimmen

Schauen Sie sich diesen Link an und lesen Sie die Kommentare am Ende, um die wichtigsten Vergleichsprobleme zu verstehen, z.B. "php" == 0 ist true*! vor PHP 8.0.0 php.net/manual/de/types.comparisons.php

0 Stimmen

Das ist falsch. Ich bin gerade auf ein Problem mit Hex-Codes gestoßen. var_dump("0E1234" == "0"); // true . Bei einem losen Vergleich interpretiert PHP einen String, der mit 0E als wissenschaftliche Zahlenschreibweise, die sich mit "0" .

4voto

None Punkte 5232

Wenn Sie entweder das eine oder das andere verwenden können, wählen Sie den strengen Vergleich, weil:

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

Beim Vergleich von Zeichenketten kann es immer noch zu unerwarteten Ergebnissen kommen, weil eine Zeichenkette leer sein könnte oder eine Variable, die Sie für eine Zeichenkette halten, in Wirklichkeit keine ist.

Sie würden niemals den Vergleich zweier String-Literale verwenden, da er immer auf TRUE oder FALSE reduziert werden kann. Zum Beispiel:

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

ist dasselbe wie

if (TRUE)

Da Sie also immer mindestens eine Variable vergleichen werden, müssen Sie davon ausgehen, dass Sie unerwartete Ergebnisse erhalten können.

Die Benchmark-Ergebnisse verschiedener strenger und lockerer Vergleiche finden Sie unter http://net-beta.net/ubench/ . Ich habe auch meine eigenen Tests durchgeführt und bin zu den gleichen Ergebnissen gekommen.

Dabei handelt es sich um eine Mikrooptimierung, d. h., Sie sollten bestehenden Code nicht ändern, da dies keinen spürbaren Unterschied macht, aber wenn Sie neuen Code schreiben, können Sie die effizientesten Techniken anwenden.

0 Stimmen

Danke! Übrigens, diese Tests net-beta.net/ubench/index.php?t=array10 scheint nicht gleichwertig zu sein. Betreiben Sie diese Website?

0 Stimmen

Die Website ist eine Referenz. Ich betreibe sie nicht. net-beta.net/ubench/ ist eine Sammlung von verschiedenen Benchmarks. Wenn Sie nach unten zu equal1 - equal7 scrollen, finden Sie die Vergleichstests. Leider gibt es auf der gesamten Seite keine Kennungen oder benannten Anker, so dass ich keinen spezifischen Link zu der Gruppe von Tests herstellen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X