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
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'aiderFor 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".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 : 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(); }
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
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 : 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(); } }
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...je parlais de la méthode par __call()
Y a plein de trucs qui manquent, mais l'idée y est.
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(); ?>
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
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 : 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 } }
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 : 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.
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.
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
Non les plugin ajoutent leurs propres méthodesTes 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 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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager