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 ) { ... }
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.
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.
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.
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.
Denken Sie immer daran, dass Sie beim Vergleichen von Zeichenfolgen den Operator ===
(strenger Vergleich) und nicht ==
(lockerer Vergleich) verwenden sollten.
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/
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.
bei strcmp () und "===" wird die Groß- und Kleinschreibung beachtet. "===" ist jedoch viel schneller
beispielcode: http://snipplr.com/view/758/
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.
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.
Sie können strcmp()
verwenden, wenn Sie Strings lexikographisch bestellen/vergleichen möchten. Wenn Sie nur nach Gleichheit suchen möchten, ist ==
in Ordnung.
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.