Erreur de comparaison PHP

O que ando ainda nesta caminhada sobre un Terra

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.

 ;

Laisser une réponse

Votre adresse email ne sera pas publié. Les champs obligatoires sont marqués *

Ce site utilise Akismet pour réduire le spam. Apprenez comment vos données de commentaire sont transformées.