protéger l'objet d'une instanciation d'une class.
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
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 ?
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>
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.
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>
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.