wake-up-neo.com

Stringvergleich mit == vs. strcmp

Es scheint, dass der ===-Operator von PHP zwischen Groß- und Kleinschreibung unterscheidet. Gibt es einen Grund, strcmp() zu verwenden? Ist es sicher etwas zu tun:

if ( $password === $password2 ) { ... }
308
Jiew Meng

Der Grund für die Verwendung ist, dass strcmp

gibt <0 zurück, wenn str1 kleiner als str2 ist; > 0, wenn str1 größer als str2 ist, und 0, wenn sie gleich sind.

=== gibt nur true oder false zurück, es sagt Ihnen nicht, welche Zeichenfolge die "größere" ist.

306
deceze

Sie sollten niemals == für den Vergleich von Zeichenketten verwenden. === ist in Ordnung.

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

Führen Sie einfach den obigen Code aus und Sie werden sehen, warum.

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';

Das ist jetzt ein bisschen besser.

209
postfuturist

Verwenden Sie nicht == in PHP. Es wird nicht das tun, was Sie erwarten. Selbst wenn Sie Strings mit Strings vergleichen, wandelt PHP sie implizit in Floats um und führt einen numerischen Vergleich durch, wenn sie numerisch erscheinen.

Zum Beispiel gibt '1e3' == '1000' true zurück. Sie sollten stattdessen === verwenden.

96
Antimony

Nun, laut diesem php Bug Report können Sie sogar 0wned bekommen.

<?php 
    $pass = isset($_GET['pass']) ? $_GET['pass'] : '';
    // Query /?pass[]= will authorize user
    //strcmp and strcasecmp both are prone to this hack
    if ( strcasecmp( $pass, '123456' ) == 0 ){
      echo 'You successfully logged in.';
    }
 ?>

Es gibt eine Warnung, umgehen aber immer noch den Vergleich.
Sie sollten === tun, wie von @postfuturist vorgeschlagen.

43
Ajith

Denken Sie immer daran, dass Sie beim Vergleichen von Zeichenfolgen den Operator === (strenger Vergleich) und nicht == (lockerer Vergleich) verwenden sollten.

32
DataPriest

Die Verwendung von == kann gefährlich sein.

Beachten Sie, dass die Variable in einen anderen Datentyp umgewandelt wird, wenn sich die beiden unterscheiden.

Beispiele:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

Wie Sie sehen können, stammen diese beiden Typen von verschiedenen Typen, aber das Ergebnis ist true, was möglicherweise nicht dem Code entspricht, den Ihr Code erwartet.

Die Verwendung von === wird jedoch empfohlen, da der Test zeigt, dass es ein bisschen schneller ist als strcmp() und die von der Groß- und Kleinschreibung unabhängige Alternative strcasecmp().

Schnelles Googeln brüllt diesen Geschwindigkeitsvergleich an: http://snipplr.com/view/758/

20

Alle Antworten zusammenfassen:

  • == ist eine schlechte Idee für Stringvergleiche .
    In vielen Fällen erhalten Sie "überraschende" Ergebnisse. Vertraue dem nicht.

  • === ist in Ordnung und liefert Ihnen die beste Leistung.

  • strcmp() sollte verwendet werden, wenn Sie feststellen müssen, welche Zeichenfolge "größer" ist, normalerweise für Sortiervorgänge.

19
Balmipour

bei strcmp () und "===" wird die Groß- und Kleinschreibung beachtet. "===" ist jedoch viel schneller

beispielcode: http://snipplr.com/view/758/

10
ungalcrys

strcmp gibt je nach Umgebung (Linux/Windows) unterschiedliche Werte zurück!

Der Grund ist der, dass es einen Fehler hat, da der Fehlerbericht https://bugs.php.net/bug.php?id=53999

Bitte vorsichtig behandeln !! Danke.

6
kta

Auch die Funktion kann beim Sortieren helfen. Um mehr über das Sortieren zu erfahren. strcmp () gibt weniger als 0 zurück, wenn string1 vor string2 sortiert wird, größer als 0, wenn string2 vor string1 sortiert ist, oder 0, wenn sie gleich sind. Zum Beispiel 

$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);

Die Funktion wird größer als Null zurückgegeben, da aaao vor aabo sortiert wird.

3
HTML Man

Sie können strcmp() verwenden, wenn Sie Strings lexikographisch bestellen/vergleichen möchten. Wenn Sie nur nach Gleichheit suchen möchten, ist == in Ordnung.

3
Daniel Egeberg

PHP Verwenden Sie anstelle der alphabetischen Sortierung den WertASCIIdes Zeichens, um den Vergleich durchzuführen. Kleinbuchstaben haben einen höherenASCII- Wert als Großbuchstaben. Es ist besser, den Identitätsoperator === zu verwenden, um diese Art von Vergleich durchzuführen. strcmp () ist eine Funktion zum Vergleichen von binären sicheren Zeichenfolgen. Es nimmt zwei Zeichenfolgen als Argumente und gibt <0 zurück, wenn str1 kleiner als str2 ist. > 0, wenn str1 größer als str2 ist, und 0, wenn sie gleich sind. Es gibt auch eine case-insensitive -Version mit dem Namen strcasecmp () , die Zeichenfolgen zuerst in Kleinbuchstaben konvertiert und sie dann vergleicht.