protéger l'objet d'une instanciation d'une class.

Rechercher

protéger l'objet d'une instanciation d'une class.

Par dancom5  -  5 reponses  -  Le 22/09/2013 02:42  -  Editer  - 

Bonjour. Je ne suis pas certain du titre que j'aurais dû mettre.

J'ai fais une expression régulière en PHP dans une classe et je me
demande s'il est possible de protéger l'objet d'une instanciation.

    <?php  
    class MaClass{  

    private $var;  

        function test($param){  

                $this->var = $param;  

                if (preg_match('/^[0-9]{1,6}$/',$this->var)):  
                    return $param;  
                else:  
                    return 0;  
                endif;  

    }  

    }  

    $obj = new MaClass();  
    $nb = $obj->test(88);  

    var_dump($nb);  

    ?>  

Bon, mon objet fonctionne bien tant que je place des chiffre comme argument dans l'objet. Mais, si dans un formulaire, je glisse autre cose qu'un chiffre, ça va m'indiquer une erreur plutôt que d'indiquer ce dont je veux comme un 0 ou un message d'erreur de mon choix.

    $nb = $obj->test(8a8);  

Glisser par exemple une lettre comme ci-dessus ou un backslash.

Si je mets un (int) devant $nb, oui ça va marcher pour les lettre mais
pas pour un backslash. Ma regexp c'est seulement à l'intérieur de la classe que ça va tester si c'est juste des chiffres.

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 22/09/2013 12:12  -  Haut de page  - 

Salut,
si je comprends bien, tu cherches à vérifier que le paramètre est bien un entier positif compris entre 0 et 999999.

Faire une classe pour ça m'apparait exagéré parce qu'il existe en PHP des fonctions natives pour ça : is_int($parametre) par exemple qui véréfie que le paramètre est bien un entier. Donc au lieu d'instancier une classe, tu pourrais vérifier deux choses : que le paramètre est bien un entier et qu'il soit compris dans les limites de 0 à 999999 :

if(is_int($parametre) && $parametre >= 0 && $parametre < 1000000)
{
    // Action si le paramètre est valide
}
else
{
    // Action si le paramètre est invalide
}

Le résultat sera exactement le même et surtout plus performant.

Ceci étant, je ne saisis pas tout de ta question : tu évoques un message d'erreur lorsque le paramètre n'est pas un entier : quel message d'erreur ?

 
Par dancom5  -  Le 22/09/2013 21:08  -  Haut de page  - 

Bonjour.

le but étant de convertir en Int les strings qui ne sont pas des chiffres entre 1 et 999999 quand je créé un objet. La condition du regexp sortait le résultat souhaité c'est à dire soit int 0 ou bien le chiffre entre 1 et 999999. Le regexp dans le code, c'était un prétexte pour mettre quelque chose dans la class pour apprendre à les utiliser. Votre solution aurait fait l'affaire aussi Merci, je n y avais pas pensé.

En faite, c'est pour essayer toutes sortes de choses dans les class pour comprendre leur fonctionnement. J'ai lu beaucoup sur la théorie mais la pratique me fait défaut et c'est ce que je tente de faire. La pratique.

<pre><code>$obj->(int)test("88")</code></pre>

 
Par Cyrano  -  Le 22/09/2013 22:51  -  Haut de page  - 

Ok, mais il faut savoir que forcer le typage peut générer une erreur si justement la valeur n'a pas le bon type. Or ce n'est probablement pas le but visé ici.

L'idée générale qui préside à la création d'une classe, c'est de disposer d'un objet pour effectuer un traitement générique qu'on peut retrouver n'importe où, mais à la condition cependant que ledit traitement soit trop complexe pour un traitement à l'aide d'une fonction native de base du langage. Dans une classe, on va le plus souvent retrouver des combinaisons de traitements simples.

 
Par dancom5  -  Le 24/09/2013 08:36  -  Haut de page  - 

Un $GET['id'] qui provient de l'URL comme http://asdf.com/index.php?id=3
fait ressortir dans un var_dump un string au lieu d'un INT.
Donc, is_int va toujours me dire que c'est faut puis que c'est un string
pas un numérique.

<pre><code>
if(is_int($parametre) && $parametre >= 0 && $parametre < 1000000)
</code></pre>

 
Par Cyrano  -  Le 24/09/2013 10:09  -  Haut de page  - 

C'était une illustration : et dans ce cas, tu peux utiliser is_numeric() qui te retournera true si le nombre est présenté comme une chaine entre guillemets. En forçant le type d'une chaine en entier, tu auras des résultats inattendus si la valeur n'est pas numérique.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |