Tester l'existence d'une variable dans une classe ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tester l'existence d'une variable dans une classe ?

Re: Tester l'existence d'une variable dans une classe ?

par abelthorne » 05 août 2009, 21:39

Et, concernant les inconvénients, je pense que tu vas me dire que c'est moins pratique.
Ben oui. Ne serait-ce que parce qu'à chaque classe je devrais manipuler tout un tas de méthodes set*() (vu que j'étends la classe de base pour des classes custom à chaque table que je manipule). Ça risque d'être un peu confus quand je travaille sur des instances de plusieurs classes en même temps. Et comme en plus j'imbrique mes classes... ;)

Et puis ça empêche un peu de créer des méthodes dont le nom commence par "set". J'imagine que ça doit être un peu le bordel si je définis par hasard / par erreur / par inattention une méthode settruc() alors que j'ai une variable $truc qui est censée être gérée par __set().
Mais si ta solution te conviens, je ne voudrais pas faire le méticuleur qui veut imposer sa solution ;)
Ouaip. Je crois que je vais la garder pour le moment. :D

Re: Tester l'existence d'une variable dans une classe ?

par zeus » 05 août 2009, 21:22

Effectivement, tu as bien compris.

Et, concernant les inconvénients, je pense que tu vas me dire que c'est moins pratique.
Certes, mais tellement plus propre, et tu as la main sur tout ce qui se passe dans ta classe, contrairement à aujourd'hui ou tu espères que tout se passe correctement.

Aujourd'hui, je n'en doute pas, tout se passe correctement. Jusqu'au jour où ... ;)

Mais si ta solution te conviens, je ne voudrais pas faire le méticuleur qui veut imposer sa solution ;)

Re: Tester l'existence d'une variable dans une classe ?

par abelthorne » 05 août 2009, 20:40

Je pense que la solution que tu as mis en place, c'est de tester l'existence de chaque variable de $_POST avant de pousser dans la classe.
Or, cette méthode n'est pas très orienté objet.
J'ai la méthode suivante dans ma classe :
function init($table){
    foreach($table as $key => $value) if(array_key_exists($key,get_object_vars($this))) $this->$key=$value;
}
Et je l'appelle avec $truc->init($_POST);
Ce que je te conseillerais, c'est d'utiliser __set() pour mettre la vérification dans la classe, et de vérifier l'existence de l'attribut dans cette méthode.

Pour commencer, quelques explications sur __set() :
__set() est une méthode qui est appelée dès que fait appelles une méthode set*() qui n'existe pas dans ta classe.
pour reprendre l'exemple de ta classe, si tu fais
$a = new A();
$a->setA('A');
et que tu as une fonction de __set() définie, c'est cette dernière qui sera appelée.
Ça, c'est une chose que j'ai du mal à comprendre : il faut donc que j'utilise des tas de méthodes set*() pour chacune de mes variables ? Par exemple, dans ma classe j'ai la variable $id ($this->id), il faut que je l'appelle avec $this->setid(54) et __set s'occupera de régler $this->id à 54 ?

Si c'est ça, je ne vois pas vraiment l'avantage par rapport à ce que je fais mais je vois des inconvénients... :/

Re: Tester l'existence d'une variable dans une classe ?

par zeus » 05 août 2009, 20:22

Je pense que la solution que tu as mis en place, c'est de tester l'existence de chaque variable de $_POST avant de pousser dans la classe.
Or, cette méthode n'est pas très orienté objet.

Ce que je te conseillerais, c'est d'utiliser __set() pour mettre la vérification dans la classe, et de vérifier l'existence de l'attribut dans cette méthode.

Pour commencer, quelques explications sur __set() :
__set() est une méthode qui est appelée dès que fait appelles une méthode set*() qui n'existe pas dans ta classe.
pour reprendre l'exemple de ta classe, si tu fais
$a = new A();
$a->setA('A');
et que tu as une fonction de __set() définie, c'est cette dernière qui sera appelée.

Donc, si le corps de ta classe est le suivant :
class A
{
    public function __set($property, $value)
    {
        if( // Vérification de l'existence de la propriété dans le code )
        {
            $this->$property = $value;
        }
    }
}
C'est franchement plus orienté plus objet, et tout aussi performant.

Re: Tester l'existence d'une variable dans une classe ?

par abelthorne » 05 août 2009, 19:58

moi, je t'aurais conseillé les méthodes magiques __get() et __set() en plus.
Je veux bien mais j'ai beau essayer de piger comment elles marchent et à quoi elles servent en lisant la doc sur php.net, je n'y arrive pas. ;)

Quel serait l'avantage de les utiliser ?

Re: Tester l'existence d'une variable dans une classe ?

par zeus » 05 août 2009, 19:56

moi, je t'aurais conseillé les méthodes magiques __get() et __set() en plus.

Re: Tester l'existence d'une variable dans une classe ?

par abelthorne » 05 août 2009, 19:51

Je veux remplir les variables d'une instance vierge de ma classe avec celles de $_POST (après envoi d'un formulaire), mais en me limitant aux variables définies : étant donné que c'est pour automatiser des requêtes SQL (mes classes sont des abstractions de tables SQL), je voudrais éviter de remplir mes instances de classes avec tout ce qui traîne en $_POST (notamment les boutons du formulaire) et passer n'importe quoi à ma requête INSERT/UPDATE.
Je ne sais pas si c'est très clair... :)

Quoi qu'il en soit, j'ai trouvé ce qu'il me fallait : les fonctions get_object_vars() et property_exists().

Re: Tester l'existence d'une variable dans une classe ?

par zeus » 05 août 2009, 19:31

Plusieurs choses

Tout d'abord, ta syntaxe, c'est du PHP 4. En PHP5, on écrirais :
class A{
    public $a;
}
Ensuite, avant de te répondre, je voudrais savoir pourquoi tu veux faire ça.

J'ai dans l'idée que nous allons pouvoir te proposer une solution beaucoup plus propre ;)

Tester l'existence d'une variable dans une classe ?

par abelthorne » 05 août 2009, 19:13

Bonjour,
Est-il possible de tester si une variable a été définie dans une classe ? Je ne cherche pas à savoir si elle a une valeur, simplement si elle est définie par la classe.
Par exemple, avec la classe suivante :

Code : Tout sélectionner

class A{ var $a; }
Je voudrais que tester $this->a me renvoie true mais qu'une variable non définie (test sur $this->b) renvoie false. (C'est pour implémenter dans une méthode de la classe, le problème ne vient pas du $this dans mon exemple.)

if(isset($this->a)) ne marche pas (teste la valeur de la variable)
if($this->a) non plus