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 confirmé
    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
    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 expérimenté Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

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

  3. #3
    Membre confirmé
    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
    Par défaut
    Si c'est possible regarde

    http://fr2.php.net/aggregate

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    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 confirmé 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
    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 confirmé
    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
    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 confirmé 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
    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 confirmé
    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
    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 confirmé 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
    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 confirmé 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
    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 confirmé
    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
    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 confirmé 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
    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 confirmé
    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
    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 confirmé 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
    Par défaut
    Tes plugins ont tous deeux méthodes <nom_de_la_classe>Write et <nom_de_la_classe>Execute ?

  15. #15
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 517
    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 517
    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.

  16. #16
    Membre confirmé
    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
    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 confirmé 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
    Par défaut
    Et comment elles sont appelées ces méthodes ? par le main ?

  18. #18
    Membre confirmé
    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
    Par défaut
    Oui le main hérite de nouvelle méthode

  19. #19
    Expert confirmé 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
    Par défaut
    oui mais qui va appeler ces méthodes ?

  20. #20
    Membre confirmé
    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
    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