La flexibilité et la facilité d'utilisation de PHP masquent parfois les comportements surprenants. Cet article explore trois de ces bizarreries, expliquant leurs causes sous-jacentes et offrant des solutions.
Prise des clés:
(int)((0.1 0.7) * 10)
peut retourner 7 au lieu du 8. in_array()
Comparaison lâche: La comparaison lâche par défaut de la fonction in_array()
peut conduire à de faux positifs. Les chaînes non vides sont extrêmement égales à true
et à des nombres non nuls, nécessitant une comparaison stricte (true
comme troisième paramètre) pour des résultats précis. INSÉNÉRATIONS DE POINT FLOCTANT:
Les nombres à virgule flottante ne peuvent pas représenter parfaitement tous les nombres réels. Les opérations sur des nombres apparemment représentés avec précision peuvent entraîner des inexactitudes subtiles. Ce n'est pas unique à PHP; C'est une limitation fondamentale de l'arithmétique informatique. L'article classique "Ce que chaque informaticien doit savoir sur l'arithmétique à virgule flottante" fournit une explication approfondie.
Considérez ce code:
<?php echo (int) ((0.1 + 0.7) * 10); ?>
La sortie est 7, pas 8. Le calcul intermédiaire 0.1 0.7
entraîne une valeur légèrement inférieure à 0,8 en raison des limitations de précision. La multiplication par 10 conserve cette erreur, et la coulée en entier tronque la partie fractionnaire, résultant en 7.
Pour atténuer cela, utilisez les fonctions de précision arbitraires BCMATH lorsque la précision est critique.
DIRICS D'INCRÉMENTATION DE CHAMP:
Le comportement d'incrément de chaîne de PHP diffère des langues comme C. Examinons ces exemples:
<?php $a = 'fact_2'; echo ++$a; // Output: fact_3 $a = '2nd_fact'; echo ++$a; // Output: 2nd_facu $a = 'a_fact'; echo ++$a; // Output: a_facu $a = 'a_fact?'; echo ++$a; // Output: a_fact? ?>
L'opérateur d'incrément (
) sur une chaîne se terminant par un nombre incréments de ce nombre. S'il se termine par une lettre, la dernière lettre est incrémentée par ordre alphabétique. Les cordes se terminant par des caractères non alphanumériques restent inchangées. Ce comportement, bien que documenté, est souvent négligé.
in_array()
et des comparaisons lâches:
Les règles de comparaison lâche de PHP affectent in_array()
. Considérez:
<?php $array = array('isReady' => false, 'isPHP' => true, 'isStrange' => true); var_dump(in_array('sitepoint.com', $array)); // Output: bool(true) ?>
La fonction renvoie true
parce que la comparaison lâche de PHP considère une chaîne non vide égale à true
. Pour appliquer une comparaison stricte, utilisez le troisième paramètre:
<?php var_dump(in_array('sitepoint.com', $array, true)); // Output: bool(false) ?>
Conclusion:
Ces exemples mettent en évidence les pièges potentiels en PHP. Soyez toujours conscient des limitations de précision à virgule flottante, comprenez le comportement d'incrément de chaîne unique de PHP et utilisez des comparaisons strictes lorsque vous traitez des tableaux et in_array()
pour éviter des résultats inattendus. Une compréhension approfondie de la gestion des types de PHP est essentielle pour écrire un code robuste et prévisible.
Image via Fotolia
(Section FAQS supprimée car elle était largement répétitive du contenu principal et les FAQ fournies n'étaient pas directement liées aux trois faits étranges présentés.)
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!