IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Méthode de "paramétrage" d'un objet


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut Méthode de "paramétrage" d'un objet
    Salut,

    Je suis en train de développer une petite classe et je me pose des questions quant à la manière d'en gérer la "configuration".
    En fait, j'ai deux possibilités qui ne m'offrent pas forcément les mêmes avantages.

    Je peux soit stocker la configuration dans un tableau et passer ce tableau en paramètre lors de l'instanciation de l'objet.
    Avantage : lors de l'instanciation de l'objet, je peux effectuer certains traitements, en les incluant dans le constructeur.
    Inconvénient : ça ne me plait que moyennement, je ne trouve pas ça très propre. Mais comme j'ai déjà vu faire ça dans un script, j'envisage la possibilité.

    Autrement, je peux instancier l'objet et modifier les propriétés ensuite. Ceci m'oblige à définir une méthode qui exécutera les traitements "automatiques" à faire avant toute autre chose.
    Avantage : ça me parait plus cohérent en terme de programmation.
    Inconvénient : il faut nécessairement passer par une méthode supplémentaire pour l'exécution "automatique".

    En fait, il s'agit d'une classe que je compte publier ensuite. Ceci a son importance du fait de l'ergonomie que je souhaite obtenir.
    Avoir un fichier séparé dans lequel on définit la configuration, laquelle est ensuite chargée à l'instanciation de l'objet me parait facile à mettre en oeuvre pour un "utilisateur lambda".
    Cependant, la deuxième méthode, similaire à Smarty, est tout à fait claire pour quelqu'un qui est habitué à la POO. Mais... elle m'empêche une exécution automatique à l'instanciation de l'objet...

    J'ai parcouru vite fait quelques sujets qui s'apparentaient à mon problème, et j'ai vu qu'il était envisageable d'utiliser une classe pour la seule configuration. N'étant pas encore au top avec la POO en php, j'ai du mal à me rendre compte de comment ça pourrait fonctionner, des avantages et inconvénients.

    Si vous avez un avis sur la question, je suis intéressé.

  2. #2
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Salut... tout dépend de ce que tu entend par configuration (nombre de paramètres, etc)... .. .

    Perso voici, en gros, comment je procède généralement... .. .

    La configuration est stockée dans un attribut sous forme de tableau... .. .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
    class maClass
    {
          var $_options;
    
          function __construct($param1 = 'pwet', $param2 = true, $param3 = 2)
          {
                $this->_options = array();
                $this->_options['param1'] = $param1;
                $this->_options['param2'] = $param2;
                $this->_options['param3'] = $param3;
          }
    
          function maClass($param1 = 'pwet', $param2 = true, $param3 = 2)
          {
                $this->__construct($param1, $param2, $param3);
                register_shutdown_function(array(&$this,'__destruct'));
          }
    
          function __destruct() { }
    
          function setOptions($options)
          {
                if(empty($options))
                      return true;
                
                $noError = true;
                
                foreach($otions as $option => $value)
                {
                      if(!$this->setOption($option,$value))
                            $noError = false;
                }
                
                return $noError;
          }
          
          function setOption($option,$value)
          {
                if(isset($this->_options[$option]))
                {
                      $this->_options[$option] = $value;
                      
                      return true;
                }
                return false;
          }
          
          function display()
          {
                if($this->_options['param2'])
                {
                      for($i=0;$i<$this->_options['param3'];++$i)
                            echo $this->_options['param1'].'<br />';
                }
                else echo $this->_options['param1'].'<br />';
          }
    }
    
    ?>
    ce qui fait que tu as possibilité de modifier tes options de plusieurs manière... à l'instanciation (si tu ne le fait pas tes options sont mise avec une valeur par défaut) via un tableau associatif te permettant de modifier plusieurs options d'un coup avec setOptions() ou alors via setOption() pour modifier une seule option... .. .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    $ex1 = new maClass();
    $ex1->display();
    
    // ou 
    
    $ex2 = new maClass('test',false);
    $ex2->display();
    
    // ou
    $ex3 = new maClass('',true,5);
    
    if($var)
          $ex3->setOption('param1','bonjour');
                else
                      $ex3->setOption('param1','au revoir');
                      
    $ex3->display();
    
    // ou encore
    $option = array(
                      'param1' => 'hello',
                      'param2' => 10,
                      'param3' => true
                );
    
    $ex4 = new maClass();
    $ex4->setOptions($options);
    $ex4->display();
    
    ?>
    Après ça dépend de ta class de ce qu'elle est cencée faire et donc du type et du nombre de paramètre dont elle à besoin... .. .

    @ tchaOo°

  3. #3
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    Salut

    moi perso, je cree une class Configuration avec une variable static config

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Configuration {
        static public $config = array ( 'conf1' => array(), 'conf2' => array() );
    }
    ensuite avec la fonction __autoload() de php5 j'ai mes configurations partout dans mon projet. et je les appel de cette maniere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $param1 = Configuration::$config['conf1'];

  4. #4
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Ouep très bonne idée mais dans le cadre d'un projet redistribuable ça te limite à php5 ce qui est pas top si la class n'utilise pas de possibilités spécifiques à php5... .. .

    @ tchaOo°

  5. #5
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    vivi c vrai,

    mais bon à partir du moment où on veut faire de l'objet en php, ...on ce doit d'utiliser php5 quand meme.

  6. #6
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Uhm... question de point de vue... portabilité Vs possibilité... tout dépend du projet... .. .

    @ tchaOo°

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Salut, et merci pour les réponses.

    En fait, j'aime bien avoir un maximum de paramètres, surtout quand c'est du code redistribué. Si je comptais le garder pour moi, ce serait mon affaire. Mais dans mon cas présent, je souhaite que l'utilisateur puisse paramétrer un maximum de choses le plus simplement possible.
    Actuellement, j'ai 9 propriétés paramétrables. Les autres ne sont utilisées que pour le fonctionnement du script.

    En gros, je ne me vois pas passer les 9 valeurs en paramètres, d'autant que ça a vocation à augmenter.

    Kankrelune, il y a un petit truc que je ne comprends pas bien dans ton exemple.
    Tu fais mention d'un constructeur avec la méthode __construct(), qui, si je ne dis pas de bêtise, à été introduite dans php5. Et tu parles aussi d'une méthode maClass(), qui me semblait être la définition du constructeur en php4, laquelle est censée être encore compatible en php5...
    Du coup, je ne vois pas l'intérêt de spécifier les deux, si ce n'est dans un soucis de compatibilité entre php 4 et 5 ? (mais je ne pige pas tous les rouages de ce mécanisme...).

    En fait, ma classe sert à manipuler certains fichiers. Je souhaite, entre autres paramètres, spécifier quel fichier, le répertoire racine (du site), quelques noms de fichiers spécifiques, etc.
    Je souhaite que certains fichiers soient lus dès l'instanciation de l'objet, et que leur contenu soit traité à ce moment là, histoire que l'objet soit utilisable en l'état. Bon, j'ai toujours la possibilité d'utiliser une méthode pour ça, qui serait appelée explicitement, mais ça me parait un peu lourd, comme je le disais, pour un simple utilisateur de ma classe. Encore une fois, si c'était pour un script perso, je ne me poserais pas la question...

    Sahid, ce que tu me décris là, c'est ce que j'ai vu quelque part, dont je parlais dans mon premier message, et dont je disais que je n'avais pas bien compris comment ça marche... (ouais, je suis pas 100% débutant en POO php, mais pas loin). Si donc, tu voulais bien détailler un poil plus, je n'y serais pas opposé

    Par ailleurs, comme le dit kankrelune, je préfère, dans le cas d'un projet redistribuable, ne pas me limiter à php5. D'ailleurs, je ne maitrise pas suffisament la POO en php pour être capable d'utiliser à fond les possibilités de php5. Pourquoi pas, plus tard, avoir deux versions, une pour php4 et une optimisée pour php5. Mais je n'en suis pas là encore.



    Je continue de réfléchir

  8. #8
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Citation Envoyé par PseudoCoder
    Kankrelune, il y a un petit truc que je ne comprends pas bien dans ton exemple.
    Tu fais mention d'un constructeur avec la méthode __construct(), qui, si je ne dis pas de bêtise, à été introduite dans php5. Et tu parles aussi d'une méthode maClass(), qui me semblait être la définition du constructeur en php4, laquelle est censée être encore compatible en php5...
    Du coup, je ne vois pas l'intérêt de spécifier les deux, si ce n'est dans un soucis de compatibilité entre php 4 et 5 ? (mais je ne pige pas tous les rouages de ce mécanisme...).
    En fait c'est très simple... cette technique permet l'émulation du destructeur de php5 en php4... quand j'instancie ma classe en php5 le parseur trouve une méthode __construct et l'éxécute "sans se poser de question"... s'il ne trouve pas __construct() il se rabattra sur maClass()... à la fin de l'éxécution de mon script le parseur execute __destruct() si celui ci existe... jusque là rien d'anormale... en php4 le parseur cherche directement maClass() car __construct() il ne connait pas je sais donc que si c'est maClass() qui est executée on est sous php4... ainsi tu remarquera un appel de register_shutdown_function() qui me permet d'enregistrer le destructeur comme fonction à exécuter à la fin du script... et hop le tour est joué ma class exécute son destructeur sous php4... ça peut être très pratique (comme inutile) surtout pour une classe comme la tienne qui manipule des fichiers (fermeture des pointeurs,etc..)... .. .

    @ tchaOo°

  9. #9
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    Citation Envoyé par PseudoCoder
    Salut, et merci pour les réponses.
    Sahid, ce que tu me décris là, c'est ce que j'ai vu quelque part, dont je parlais dans mon premier message, et dont je disais que je n'avais pas bien compris comment ça marche... (ouais, je suis pas 100% débutant en POO php, mais pas loin). Si donc, tu voulais bien détailler un poil plus, je n'y serais pas opposé
    c quoi que tu n'as pas compris ??
    sache quand meme que ca utilise des fonctionnalitées offerte seulement par PHP5

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Ce que je n'ai pas compris... A peu près tout...
    Ton exemple est à peu près clair, quoi que pas encore très parlant pour moi, mais je ne vois pas vraiment quels avantages je retire de cette technique.
    En plus, j'ai un peu de mal avec l'utilisation de l'opérateur de résolution de portée : ça ne me parle pas vraiment et c'est un peu trop abstrait pour moi, encore...

    Je ne doute pas que ça n'utilise pas des fonctionnalités propres à php5. J'insistais simplement sur le fait que j'ai besoin que ce soit 100% compatible php4 et 5

  11. #11
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    l'accès à une variable statique ce fait très facilement, pas besoin de créer une instance de la class configuration, puis étant donner que les configurations ne change pas il n'est pas nécessaire de crée des copie de celle ci à chaque fois que tu en a besoin, ça alourdi le soft et diminue les perf, sans compter que tu y perd en clarté dans le code

    tu as juste à faire MaClass::MaVarStatic

  12. #12
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Mais justement... Si je veux créer plusieurs instances d'une même classe, chacun ayant une configuration différente ?
    L'exemple bête, dans mon cas, mes objets manipulent un fichier spécifique.
    Plusieurs objets manipuleraient donc plusieurs fichiers de la même nature, mais situés dans des répertoires différents, faisant référence chacun à un fichier utilisateur différent, etc

    Est-ce que l'utilisation d'une classe configuration serait, dans ce cas là, également intéressante ?

    Pour l'instant, j'expérimente avec deux arguments passés lors de l'instanciation : le premier définissant le chemin d'un fichier, le second étant un tableau avec le reste de la configuration, laquelle, si elle n'est pas mentionnée, prend des valeurs par défaut. L'idée est que le second paramètre est optionnel, pas le premier.

    Je ne sais pas si faire des tests de performances serait vraiment aisé à mettre en place ou pertinent. Je verrai plutôt ce qui est le plus ergonomique pour un utilisateur lambda.

    Je ne fais qu'expérimenter, je reste ouvert à toute solution alternative

  13. #13
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Pour les test de performance fais une recherche à XDebug... .. .

    @ tchaOo°

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo