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
Version imprimable
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
ajouter des méthodes a un objet c'est impossible ça
tu veux lancer une fonction en fait?
Si c'est possible regarde ;)
http://fr2.php.net/aggregate
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
ça doit pouvoir t'aiderCitation:
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."
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".Citation:
Envoyé par laurent_h
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:
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(); }
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 :roll:
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 ?
Bonsoir,
je parlais de la méthode par __call()
sinon avez vous une piste pour faire de l'héritage multiple ?
Merci
Oui, l'aggregation :)
Mais j'entends aggregation "manuelle" :
Code:
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(); } }
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...Citation:
je parlais de la méthode par __call()
Y a plein de trucs qui manquent, mais l'idée y est.Code:
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(); ?>
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 :cry:
un petit exemple
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 ?Code:
1
2
3
4
5
6
7
8
9 class Main { function loadPlugin($plugin) { include("$plugin.class.php"); aggregate($this, $plugin); // emulate multiple inheritance } }
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 :evil:Code:Car il me semble que le eval serait assez gourmand en ressources ?
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 ?
Voici un exemple plus complet
Code:
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.
Tes plugins ont tous deeux méthodes <nom_de_la_classe>Write et <nom_de_la_classe>Execute ?
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.
Non les plugin ajoutent leurs propres méthodesCitation:
Tes plugins ont tous deeux méthodes <nom_de_la_classe>Write et <nom_de_la_classe>Execute ?
Et comment elles sont appelées ces méthodes ? par le main ?
Oui le main hérite de nouvelle méthode
oui mais qui va appeler ces méthodes ?
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