L'égalité surprenante des nombres de chaînes de PHP : exploration de l'anomalie '0 == "e"'
En PHP, une comparaison apparemment anodine peut produire des résultats inattendus, comme le montre l'extrait de code ci-dessous :
$item['price'] = 0; if ($item['price'] == 'e') { $item['price'] = -1; }
Malgré l'initialisation de $item['price'] à 0, la condition if est inexplicablement évaluée à true lorsque « e » est attribué au prix, traitant 0 comme équivalent à la chaîne « e » .
La révélation : le casting de types et l'opérateur == PHP
Le Le coupable réside dans l'opérateur == de PHP, qui tente de convertir les opérandes dans le même type avant d'effectuer la comparaison. Dans ce cas, il convertit l’entier 0 en chaîne. Puisque « e » n'est pas un entier valide, il devient 0, ce qui entraîne une fausse correspondance.
La solution : adopter une comparaison stricte
Pour éviter de telles anomalies, il est Il est conseillé d'utiliser l'opérateur === au lieu de ==. === effectue une comparaison stricte qui n'implique pas de coercition de type, garantissant que seules les valeurs du même type sont considérées comme égales.
Le changement révolutionnaire de PHP 8
Contrairement aux versions précédentes, PHP 8 a introduit un comportement modifié pour les comparaisons de numéros de chaînes. Au lieu de convertir des nombres en chaînes, PHP 8 convertit des chaînes en nombres chaque fois que cela est possible. Ce changement est conforme aux attentes, garantissant que 0 et « e » ne sont plus considérés comme égaux.
En résumé
L'opérateur == de PHP peut conduire à des résultats surprenants lors de la comparaison chaînes et nombres en raison de la conversion de type. Pour éviter tout comportement inattendu, il est essentiel d'utiliser l'opérateur === pour des comparaisons strictes. De plus, l'approche révisée de PHP 8 en matière de comparaison de numéros de chaînes améliore la cohérence et l'exactitude du code.
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!