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

Langage PHP Discussion :

[POO] Plugins pour une classe ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 67
    Points
    67
    Par défaut [POO] Plugins pour une classe ?
    Salut,

    J'ai un défaut, quand je développe : j'aime bien faire dans l'excès... Paramétrage à outrance, extensibilité maximale, ...

    Dans la série extension d'une classe, je me demande comment implémenter genre de système de plugins. La question qui me vient tout de suite, c'est peut-on rajouter tout un tas de méthodes à une classe, sans utiliser une classe étendue... ?
    Si je veux ajouter à une classe les méthodes d'une autre, j'utilise une classe étendue. Ok. Mais si je veux lui ajouter les méthodes de deux autres classes ?

    La seule solution que j'ai trouvée ne me parait pas très "propre", mais je n'ai encore pas trouvé mieux. Cela consiste à utiliser la surcharge de méthode.
    La méthode __call(), qui exécute un code déterminé si la méthode appelée n'existe pas. Cela permet par exemple d'exécuter une fonction portant le nom de cette méthode.
    La question que je me pose à ce sujet concerne la quantité de ressources utilisées. Est-ce que ce n'est pas un peu lourd ?

    Si vous avez mieux à me proposer, je suis preneur
    Merci d'avance.
    On imagine rarement les ressources que l'on peut trouver ici

  2. #2
    Membre éclairé
    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
    Points : 858
    Points
    858
    Par défaut
    -1- pour qu'une classe hérite des propriétés de deux classes parentes y a pas de secrets tu fais

    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
     
    class parentClass1
    {
     
    }
     
    class parentClass2 extends parentClass1
    {
     
    }
     
    class finalClass extends parentClass2
    {
     
    }
    Pour le système de plugins chargé à la volée c'est une autre histoire... le mieux étant de charger tes objets dans un attribut tableau après effectivement c'est plus lourd que d'utiliser call (dispo juste sous php5) mais c'est plus simple à mon gout (je ne suis pas encore complètement passé à php5)... .. .

    @ tchaOo°

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

    Informations professionnelles :
    Activité : Développeur Web

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

    tu peux utiliser les classes abstraite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    abstract class ModelPlug {
     
        protected $monObjet;
     
        public function __construct(Objet $monObjet) {
            $this->monObjet = $monObjet;
        }
     
       abstract function pluging( Class $objClass, $arg1, arg2 );
    }
    ainsi toutes tes classes qui herite de ModelPlug, devront avoir cette forme

    et avec un instanceof tu peux verifier que ton pluging herite bien de ModelPlug

    sahid

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Re,

    Encore les mêmes qui répondent Dites-moi si je suis lourd

    kankrelune : les classes étendues comme ça, c'est justement ce que je veux éviter, l'idée d'un plugin étant que le développeur ne sait pas à l'avance ce qui devra être chargé...
    Citation Envoyé par kankrelune
    le mieux étant de charger tes objets dans un attribut tableau après effectivement c'est plus lourd que d'utiliser call (dispo juste sous php5) mais c'est plus simple à mon gout (je ne suis pas encore complètement passé à php5)... .. .
    Là, il faut que je réfléchisse plus de 2 secondes pour bien comprendre... (noob que je suis...)
    Charger les objets dans un attribut tableau ? Tu veux dire les plugins dans une propriété de la classe que les plugins doivent "étendre" ?
    Je ne sais pas encore comment doivent se présenter ces plugins...
    En fait, il peuvent être de deux sortes : s'intégrer dans une méthode existante, ou bien étendre littéralement la classe en la dotant de méthodes supplémentaires. J'imagine que dans les deux cas, la gestion n'est pas la même.
    Dans le premier, je sais parfaitement comment faire. Un système de plugins comme pour Phorum : les fichiers sont inclus dans le script, des crochets appellent les fonctions dont le nom est fonction du plugin et du crochet en question.
    Ma question porte donc sur le deuxième cas : rajouter des méthodes.

    (désolé, je réfléchis au fur et à mesure que j'écris)

    Sahid : Alors là, c'est mon gros problème... Les classes abstraites, c'est... euh comment dire... trop abstrait pour moi. J'ai survolé la doc php et n'ai absolument rien compris à ce qu'était une classe abstraite, ce que ça apporte, ce qui la différencie d'une classe normale de base, etc.
    Du coup, comme je n'ai pas senti de manque sur la question, je ne me suis pas documenté outre mesure sur le sujet.
    Question : il me semble que les classes abstraites ont fait leur apparition avec php5 ? Du coup... comment rendre un tel code compatible avec php4 ?
    Accessoirement, si t'as des liens intéressants et pertinents sur la question, plus que la doc php, je suis intéressé. Sinon, si c'est vraiment intéressant pour mon cas, je ferai les recherches nécessaires (c'est pas que je suis fainéant, mais si t'as des liens... c'est un gain de temps )

    Merci en tout cas de vos réponses

    EDIT> Je crois que j'ai trouvé ce qu'il me faut, dans la doc de php4 : http://fr.php.net/manual/fr/language...#keyword.class
    Le premier commentaire...
    En y réfléchissant, je pense que c'est ce que tu me disais, kankrelune... Charger un objet dans une propriété. Une méthode de la classe principale permet alors d'exécuter une méthode de ce "sous-classe" chargée.

    Je considère que c'est ok comme ça

    Merci encore.
    On imagine rarement les ressources que l'on peut trouver ici

  5. #5
    Membre éclairé
    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
    Points : 858
    Points
    858
    Par défaut
    Salut...

    Concernant les class parent il faut bien dissocier le but... dans mon premier exemple on éttend une class avec d'autres class indispensable... en aucun cas il sagit de plugin mais de class spécialisé indispensable pour le fonctionement de la class mère (par exemple la gestion des erreurs) ce sont deux choses bien différentes... .. .

    Concernant les plugins en gros le lien que tu donne pose le principe... par exemple dans le cas de plugins multiples... .. .

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    <?php
    
    define('MACLASS_MAIN_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    define('MACLASS_PLUGINS_PATH',MACLASS_MAIN_PATH.'plugins'.DIRECTORY_SEPARATOR);
    
    class maClass extends classMere
    {
          /*
          * Attributs de la class... .. .
          */
          var $_plugins = array();
    
          
          /*
          * methodes normales de la class
          */
          
          
          /*
          * Plugins
          */
          function pluginIsLoaded($plugName)
          {
                return (isset($this->_plugins[$plugName]) && is_object($this->_plugins[$plugName]));
          }
    
          function _loadPlugin($plugName)
          {
                if(!$this->pluginIsLoaded($plugName))
                {
                      if(is_file(MACLASS_PLUGINS_PATH.$plugName.'.php'))
                      {
                            include_once(MACLASS_PLUGINS_PATH.$plugName.'.php');
                            
                            $className = 'maClass'.ucfirst($plugName).'Plugin';
                            
                            if(class_exists($className))
                            {
                                  $this->_plugins[$plugName] = new $className();
                                  return true;
                            }
                            else
                            {
                                  // error handling la class n'est pas définie
                                  return false;
                            }
                      }
                      else
                      {
                            // error handling le fichier est introuvale
                            return false;
                      }
                }
                return true;
          }
          
          /*
          * après deux solution...
          * soit tes plugins n'ont qu'une seule méthode publique 
          * à ce moment la on se tournera plutot vers execPlugins
          * soit il y a plusieurs méthodes qui pevent être appelées 
          * à ce moment la on se tournera vers apply plugin 
          */
          function execPlugin($plugName)
          {
                if($this->_loadPlugin($plugName))
                {
                      if(func_num_args() === 1)
                            return $this->_plugins[$plugName]->execute();
                      else
                      {
                            $args = func_get_args();
                            array_shift($args);
                            
                            return $this->_plugins[$plugName]->execute($args);
                      }
                }
                return false;
          }
          
          function execPlugin($plugName,$method)
          {
                if($this->_loadPlugin($plugName))
                {
                      if(!method_exists($this->_plugins[$plugName],$method))
                      {
                            // error handling la méthode demandée n'existe pas
                            return false;
                      }
                      elseif(func_num_args() === 2)
                            return $this->_plugins[$plugName]->$method();
                      else
                      {
                            $args = func_get_args();
                            $args =  array_slice($args , 2);
                            
                            return $this->_plugins[$plugName]->$method($args);
                      }
                }
                return false;
          }
    }
    ?>
    @ tchaOo°

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Salut,

    Merci d'avoir passé du temps là-dessus !
    Je garde ça sous le coude et y jetterai un oeil nu peu plus attentif très prochainement. Ca me parait pas mal en tout cas, au premier abord, même si je suis en train de me demander très sérieusement si je vais pas tout simplement développer en php5 uniquement...
    Oui, je sais, portabilité, compatibilité... M'enfin faut parfois faire des choix... Et si php5 m'apporte des solutions qui seraient trop difficilement adaptables en php4...

    En tout cas merci pour les infos, le script et le temps passé
    On imagine rarement les ressources que l'on peut trouver ici

  7. #7
    Membre éclairé
    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
    Points : 858
    Points
    858
    Par défaut
    Pas de p... .. .

    Après concernant la version de php je ne suis pas sûr que php5 puisse résoudre le problème... je pense que tu bloquera sur les mêmes points... cependant la technique que je te donne fonctionne très bien... après le choix du language, version, protabilité ne tient qu'a toi... tout dépend du projet... .. .

    @ tchaOo°

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Equivalent de getElementById mais pour une class ?
    Par boutmos dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 29/04/2008, 10h19
  2. [POO] POO pour une classe PDO
    Par nabab dans le forum Langage
    Réponses: 2
    Dernier message: 07/08/2007, 23h58
  3. Réponses: 3
    Dernier message: 02/12/2005, 15h58
  4. Réponses: 8
    Dernier message: 02/11/2005, 20h21
  5. ecrire un iterateur pour une classe
    Par Blowih dans le forum C++
    Réponses: 2
    Dernier message: 15/11/2004, 19h19

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