Erreur de comparaison PHP
Aujourd'hui, J'ai écrit un script en PHP pour être utilisé dans la ligne de commande lorsque je suis tombé sur un comportement inattendu (au moins de ma part).
Le script devrait recevoir trois arguments, le dernier d'entre eux une liste contenant un ou plusieurs codes numériques.
Essayant de valider ce dernier argument a été d'obtenir un résultat différent qu'imaginé.
Voir l'extrait de code que j'utilisais:
// test.php if (php_sapi_name() == « cli ») { $di = isset($argv[1]) ? $argv[1] : Date("Y-m-d"); // Initial Date $df = isset($argv[2]) ? $argv[2] : Date("Y-m-d"); // Final Date $prods = isset($argv[3]) ? exploser(',', $argv[3]) : Tableau(); // Liste de codes ##### Validation de // Initial Date if ($di != date("Y-m-d", strtotime($di))) { ECHO "\n"; ECHO "ERREUR! DATE initiale non valide!\n"; sortie; } // Final Date if ($DF != date("Y-m-d", strtotime($DF))) { ECHO "\n"; ECHO "ERRO! DATE finale non valide!\n"; sortie; } // Codes if (comte($prods) > 0) { foreach ($prods comme $prod) { If ($prod != (int)$prod) { ECHO "\n"; ECHO "ERREUR! Le CODE " . $prod . " n'est pas valide!\n" ; sortie; } } } ECHO "FAIT!"; }
Il est intéressant, Quand j'ai couru
# php -f test.php 2015-12-10 2015-12-11 33b
le résultat a été
# FAIT
et inverser la condition à
If ($prod == (int)$prod)
afficher le message ATTENDU.
J'ai essayé d'affecter à une variable distincte et continue ne fonctionne ne pas.
$vérifier = (int) $prod; If ($prod != $check) {
Whyyy??
La comparaison de Type
!==
ne peut pas être utilisé ici, étant donné que tous les arguments seront des chaînes. Quand j'ai bien qu'à ce sujet, j'ai eu la réponse.
J’ai donc fait quelques tests en ligne de commande et j’ai vérifié le comportement réel des comparaisons PHP..
Quand nous faisons les choses comme:
$chaîne == $integer
PHP fera toujours un CAST de String à l’autre type avant la comparaison, Si le code
$chaîne == (int) $chaîne
reviendra toujours vrai, depuis $chaîne changera à int des deux côtés.
Pour éviter ce genre d'ennui, est nécessaire d’avoir le même type dans les deux côtés de la comparaison.
$CONF = (int) $prod;
If ($prod != (chaîne) $CONF) {
// OR
if ($prod != (chaîne)(int)$prod) {
A la prochaine.