Il semble que l'opérateur ===
de PHP est sensible à la casse? Y a-t-il une raison d'utiliser strcmp()
? Est-il prudent de faire quelque chose comme:
if ( $password === $password2 ) { ... }
La raison de l’utiliser est parce que strcmp
renvoie <0 si str1 est inférieur à str2; > 0 si str1 est supérieur à str2 et 0 s'ils sont égaux.
===
ne renvoie que true
ou false
, il ne vous dit pas quelle est la chaîne "plus grande".
Vous ne devriez jamais utiliser ==
pour la comparaison de chaînes. ===
est OK.
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Il suffit de lancer le code ci-dessus et vous verrez pourquoi.
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
Maintenant, c'est un peu mieux.
N'utilisez pas ==
en PHP. Cela ne fera pas ce que vous attendez. Même si vous comparez des chaînes à des chaînes, PHP les convertit implicitement en float et effectue une comparaison numérique si elles apparaissent numériques.
Par exemple, '1e3' == '1000'
renvoie true. Vous devriez utiliser ===
à la place.
Eh bien..Selon ce rapport de bogue php , vous pouvez même vous faire avoir.
<?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.';
}
?>
Cela vous avertit, mais contourne toujours la comparaison.
Vous devriez faire ===
comme @postfuturist l’a suggéré.
Rappelez-vous toujours que lorsque vous comparez des chaînes, vous devez utiliser l'opérateur ===
(comparaison stricte) et l'opérateur pas ==
(comparaison approximative).
Utiliser ==
pourrait être dangereux.
Notez que la variable sera convertie en un autre type de données si les deux diffèrent.
Exemples:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
Comme vous pouvez le constater, ces deux types sont différents, mais le résultat est true
, ce qui pourrait ne pas correspondre à ce que votre code attend.
Il est toutefois recommandé d’utiliser ===
car le test montre qu’il est un peu plus rapide que strcmp()
et que son alternative insensible à la casse strcasecmp()
.
Google goûte rapidement cette comparaison de vitesse: http://snipplr.com/view/758/
Résumant toutes les réponses:
==
est une mauvaise idée pour les comparaisons de chaînes .
Cela vous donnera des résultats "surprenants" dans de nombreux cas. Ne lui faites pas confiance.
===
est correct et vous donnera les meilleures performances.
strcmp()
devrait être utilisé si vous devez déterminer quelle chaîne est "plus grande", généralement pour les opérations de tri.
strcmp () et "===" sont tous les deux sensibles à la casse mais "===" est beaucoup plus rapide
exemple de code: http://snipplr.com/view/758/
strcmp renverra différentes valeurs en fonction de l'environnement sous lequel il est exécuté (Linux/Windows)!
La raison en est qu’il ya un bogue, comme le dit le rapport de bogue https://bugs.php.net/bug.php?id=53999
S'il vous plaît manipuler avec soin !! Merci.
La fonction peut aussi aider au tri. Pour être plus clair sur le tri. strcmp () renvoie moins de 0 si chaîne1 trie avant chaîne2, supérieur à 0 si chaîne2 trie avant chaîne1 ou 0 si elles sont identiques. Par exemple
$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);
La fonction retournera supérieure à zéro, car aaao trie avant aabo.
Vous pouvez utiliser strcmp()
si vous souhaitez commander/comparer des chaînes lexicographiquement . Si vous souhaitez simplement vérifier l’égalité, alors ==
convient parfaitement.
PHP Au lieu d'utiliser un tri alphabétique, utilisez la valeurASCIIdu caractère pour effectuer la comparaison. Les lettres minuscules ont une valeur plus élevéeSCICIIque les majuscules. Il est préférable d'utiliser l'opérateur d'identité === pour effectuer ce type de comparaison. strcmp () est une fonction permettant d'effectuer des comparaisons de chaînes binaires sûres. Il prend deux chaînes comme arguments et renvoie <0 si str1 est inférieur à str2; > 0 si str1 est supérieur à str2 et 0 s'ils sont égaux. Il existe également une version insensible à la casse nommée strcasecmp () qui convertit d’abord les chaînes en minuscules puis les compare.