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] PHP 5 : aggregate sans refkit [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut [POO] PHP 5 : aggregate sans refkit
    Bonjour,

    je recherche un moyen de faire de l'aggregate en php5.0 car la méthode n'est plus supporté.

    aggregate permet d'ajouter les méthodes d'une classe dynamiquement à un objet

    Merci pour votre aide
    PS: je recherche à le faire sans extension

  2. #2
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    ajouter des méthodes a un objet c'est impossible ça
    tu veux lancer une fonction en fait?

  3. #3
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Si c'est possible regarde

    http://fr2.php.net/aggregate

  4. #4
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    ouai j'ai du mal a comprendre comment ça marche et comme je suis en exam j'ai pas trop le temps de chercher

    il y a ceci sur ta page
    For PHP5 applications, the aggregate functionality available through classkit has been incorporated into and replaced by runkit. Per the classkit page of the PHP manual:

    "Note: This extension has been replaced by runkit, which is not limited to class manipulation but has function manipulation, as well."

    http://php.net/manual/en/ref.runkit.php

    Per the runkit page:

    " This package is meant as a feature added replacement for the classkit package. When compiled with the --enable-runkit=classkit option to ./configure, it will export classkit compatible function definitions and constants."
    ça doit pouvoir t'aider

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par laurent_h
    aggregate permet d'ajouter les méthodes d'une classe dynamiquement à un objet
    AMHA tu ne pourras pas le faire de manière totalement transparente. Autant connaitre la liste des méthodes d'une classe est chose aisée, autant en affecter une nouvelle est ardu sans passer par __call(), ce qui implique de modifier ta classe et qu'elle sache qu'elle est "agreggable".

    Ou alors ce que tu pourrais faire, c'est définir dynamiquement une nouvelle classe, remplacer l'objet par une nouvelle instance qui se chargerait de s'occuper de l'aggregation.
    un truc dans le genre (pseudo code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function aggregate($object, $classname) {
       $class_name_of_object = get_class($object);
       AGGREGATOR = new $classname();
       eval('class XXXX extends '. $class_name_of_object .' {
          function __call($method, $args) {
             if (method_exists($this, $method)) {
                return call_user_func_array(array($this, $method), $args);
             } else {
                return call_user_func_array(array(AGGREGATOR, $method), $args);
             }
          }
       }');
       $object = new XXXX();
    }

  6. #6
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Merci pour ces réponses

    Mr N. pourrais tu me donner un exemple simplifié de la première solution ?

    Pour la seconde solution, cela me parait un peu lourd non ?
    et de plus, est ce que les propriétés de mon objets initiales sont conservées ?


    Merci encore

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je n'ai proposé qu'une solution, et encore ce n'est qu'un embryon de solution, une piste sans savoir si elle est viable

    Donc de quelle(s) solution(s) parles-tu ?

  8. #8
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Bonsoir,

    je parlais de la méthode par __call()
    sinon avez vous une piste pour faire de l'héritage multiple ?


    Merci

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Oui, l'aggregation
    Mais j'entends aggregation "manuelle" :
    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
     
    interface iavion { function vole(); }
    class avion implements iavion {
      function vole() {
         ...
      }
    }
    interface ibateau { function flotte(); }
    class bateau implements ibateau {
      function flotte() {
         ...
      }
    }
    class hydravion extends avion implements ibateau {
       function flotte() {
          $this->bateau->flotte();
       }
    }

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    je parlais de la méthode par __call()
    Je n'ai malheureusement pas de php5 sous la main, alors j'ai fait un petit prototype à la sauce php4, ça devrait tourner sous php5...
    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
    <pre><?php
     
    class Avion {
        var $altitude;
     
        function __construct() {
            $this->Avion();
        }
     
        function Avion() {
            $this->altitude = 0;
        }
     
        function getAltitude() {
            return $this->altitude;
        }
     
        function vole() {
            $this->altitude += 100;
            echo 'vole => '. $this->getAltitude() ." <br>\n";
        }
    }
     
    class Bateau {
        var $noeuds;
     
        function __construct() {
            $this->Bateau();
        }
     
        function Bateau() {
            $this->noeuds = 0;
        }
     
        function getNoeuds() {
            return $this->noeuds;
        }
     
        function flotte() {
            $this->noeuds++;
            echo 'flotte => '. $this->getNoeuds() ." <br>\n";
        }
    }
     
    $avion = new Avion();
    $avion->vole();
    $avion->vole();
    $bateau = new Bateau();
    $bateau->flotte();
    $bateau->flotte();
     
    echo "<hr>";
     
    class Aggregator {
        function aggregate($object, $classname) {
            $newclass = 'Aggregator_'. get_class($object) .'_'. $classname;
            $code  = 'class '. $newclass .' extends '. get_class($object) .' { ';
            $code .= '  function __construct() { ';
            $code .= '     $this->'. $newclass .'(); ';
            $code .= '  } ';
            $code .= '  function '. $newclass .'() { ';
            $code .= '     $this->_aggregator_'. $classname .' = new '. $classname .'(); ';
            foreach(get_object_vars($object) as $key => $value) {
                $code .= '     $this->'. $key .' = "'. (is_null($value) ? 'NULL' : strval($value)) .'"; ';
            }
            $code .= '  } ';
            foreach(get_class_methods($classname) as $method) {
                if (!method_exists($object, $method)) {
                    $code .= '  function '. $method .'() { ';
                    $code .= '     $this->_aggregator_'. $classname .'->'. $method .'(); ';
                    $code .= '  } ';
                }
            }
            $code .= '}';
            eval($code);
            $object = new $newclass();
            return $object;
        }
    }
     
    $a = new Aggregator();
    $hydravion = $a->aggregate(new Bateau(), 'Avion');
    $hydravion->vole();
    $hydravion->flotte();
     
    ?>
    Y a plein de trucs qui manquent, mais l'idée y est.

  11. #11
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Merci pour cette réponse, j'ai oublié de stipuler mon problème exacte ( au tant pour moi).

    J'ai une classe principale Main.class.php qui possède un systeme de plugin, en passant par la méthode loadPlugin(), la classe main hérite des méthodes du plugin chargés et ce en conservant ses propriétés d'origine.

    Je recherche un moyen de crée ce sytème de manière simple, mais apparemment en PHP5 c'est pas gagner

    un petit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Main
    {
       function loadPlugin($plugin)
       {
              include("$plugin.class.php");
              aggregate($this, $plugin); // emulate multiple inheritance
        }
    }
    En fait, l'idée est de conserver cette simplicité ? penses tu que ce soit possible sans modifier tous les plugin en cascade ou doit je faire une suite d'extends successifs en cascade et abandonner le systeme de plugin ?

    Car il me semble que le eval serait assez gourmand en ressources ?

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Car il me semble que le eval serait assez gourmand en ressources ?
    Le eval n'est pas seulement gourmand en ressources, il est surtout couteux en temps de développement et de debuggage

    Concernant ton besoin, je ne sais quoi dire. Je ne comprends pas trop ce que tu cherches à faire.
    Est-ce que tu pourrais mettre un exemple de plugin ?

  13. #13
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Voici un exemple plus complet

    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
     
    class Main()
    {
        var $name = '';
     
        function loadPlugin()
        {
     
        }
     
        function execute()
        {
     
        }
     
        function setName($name)
        {
               $this->name = $name;
        }
    }
     
    class Mail()
    {
         function MailWrite()
         {
     
         }
     
         function MailSend()
         {
     
         }
    }
     
    $m = new main();
    $m->SetName('Coucou');
    $m->Execute();
     
     
    $m->LoadPlugin('mail');
    $m->MailWrite();
    $m->MailExecute();
     
     
    Ceci est un exemple volontairement simplifié et on peux chargé à la volé ses plugins.

  14. #14
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Tes plugins ont tous deeux méthodes <nom_de_la_classe>Write et <nom_de_la_classe>Execute ?

  15. #15
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 039
    Points
    6 039
    Par défaut
    Ajouter une methode dynamiquement à un objet me parait un poil illogique. Je comprend le principe de plugin pour que tu puisses ajouter des fonctionnalités. Je pense qu'il faudrait ajouter un objet à l'objet et ce dernier peu accéder au propriété du nouveau objet ceci dans une collection.
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  16. #16
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Tes plugins ont tous deeux méthodes <nom_de_la_classe>Write et <nom_de_la_classe>Execute ?
    Non les plugin ajoutent leurs propres méthodes

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et comment elles sont appelées ces méthodes ? par le main ?

  18. #18
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Oui le main hérite de nouvelle méthode

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    oui mais qui va appeler ces méthodes ?

  20. #20
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Pardon, je comprends pas

    mon objet instancié avec main grace à la méthode loadPlugin charge les méthodes du plugin en plus des siennes tout en gardant ses propriétés initiales.

    J'espère que c'est plus clair... merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [POO] PHP 5 - gestion de la persistance
    Par BRAUKRIS dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2010, 13h34
  2. Réponses: 16
    Dernier message: 06/06/2007, 12h42
  3. Réponses: 2
    Dernier message: 21/10/2005, 11h26
  4. [POO] [PHP 5 CLASSES]Source à part?
    Par Jean_Benoit dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2005, 11h50
  5. [POO] PHP et la gestion des classes
    Par Acti dans le forum Langage
    Réponses: 7
    Dernier message: 23/09/2005, 00h06

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