Explication détaillée de l'utilisation de la comparaison de chaînes d'opérateurs == de PHP et de ses exemples d'effets secondaires

伊谢尔伦
Libérer: 2023-03-10 22:00:01
original
1417 Les gens l'ont consulté

Dans certains cas, PHP convertira des données numériques (telles que chaîne contenant des nombres, etc.) en traitement numérique, == opérateur en fait partie. Lorsque vous utilisez l'opérateur == pour comparer vaguement deux chaînes, PHP convertira la chaîne numérique en une valeur numérique à des fins de comparaison. L'expérience suivante confirme cette conclusion :

<?php
var_dump(&#39;01&#39; == 1);
?>
Copier après la connexion

La sortie du code ci-dessus Le résultat est : bool(true)

Par conséquent, lors de la comparaison de chaînes, il est recommandé d'utiliser l'opérateur === pour vérifier strictement la chaîne, ou d'utiliser la fonction strcmp() pour éviter d'éventuels problèmes.

De plus, la fonction in_array() couramment utilisée présente également des problèmes de type faible, voir le code suivant :

<?php
var_dump(in_array(&#39;01&#39;, array(&#39;1&#39;)));
?>
Copier après la connexion

Le résultat de sortie du code ci-dessus est : bool(true)
Je crois que les programmeurs PHP qui ont utilisé cette fonction pour les contrôles de sécurité savent quel type de problèmes de sécurité cela entraînera, n'est-ce pas ? Heureusement, la fonction in_array() nous fournit un troisième paramètre. Le définir sur true peut activer le mécanisme de vérification de type obligatoire de la fonction in_array(), comme indiqué dans le code suivant :

<?php 
var_dump(in_array(&#39;01&#39;, array(&#39;1&#39;), true)); 
?>
Copier après la connexion

Sortie Le résultat est : bool(false)
Puisque PHP est un langage faiblement typé, c'est-à-dire que la notion de type de données est affaiblie en PHP. Par conséquent, si vous ignorez trop les types de données lors de la programmation (ce qui est également un problème courant chez la plupart des programmeurs PHP), certains problèmes surviendront et même des failles de sécurité se produiront. Enfin, comme le dit le dicton ennuyeux, vérifiez et filtrez strictement les données externes.

Effets secondaires

$a = &#39;212345678912000005&#39;; 
$b = &#39;212345678912000001&#39;; 
var_dump($a == $b);
Copier après la connexion

La sortie de ce code est bool(true), ce qui signifie que ce jugement conclura que les deux sont égaux. Similaire La fonctionnalité est utilisée lorsque le troisième paramètre de la fonction in_array() est faux ou n'est pas défini. La raison est d'abord de déterminer si la chaîne est un nombre, puis de la convertir en long ou double (langage C . type de données) puis déterminez - utilisez zendi_smart_strcmp. Cependant, les commentaires dans le code source indiquent que l'instruction considère les situations de débordement

} else if (dval1 == dval2 && !zend_finite(dval1)) { 
    /* Both values overflowed and have the same sign, 
     * so a numeric comparison would be inaccurate */ 
    goto string_cmp; 
}
Copier après la connexion

dval1 et dval2 sont les valeurs de deux chaînes converties respectivement en double. Mais pourquoi est-ce toujours le cas ?
Solution, utilisez trois signes égaux "===" au lieu de deux signes égaux "==", et la fonction in_array() définit le troisième paramètre sur true : in_array('val' , $array, vrai).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal