destroyedlolo Posté 12 Juillet 2008 Posté 12 Juillet 2008 (modifié) Bonjour, Pour palier a l'absence de l'heritage multiple en PHP5, j'utilise des __call() pour appeler des methodes qui se trouvent dans d'autres classes. Par exemple : CODE class A { function toto(){ echo "coucou"; } } class B { // bla bla } class C extends B { // plein de truc mais pas de toto() function __call($m, $arg){ return(A::$m()); } } $obj = new C; $obj->toto(); Dans ce cas, toto() n'existe ni dans C, ni dans B, mais celui de la method A est appele par le __call(). Le bleme, c'est que les arguments sont passees sous forme d'un tableau $arg alors comment puis-je ecrire ma fonction __call() pour eclater les arguments ? Pour le moment, je fais des function __call($m, $arg){ switch(count($arg)){ case 0: return(A::$m()); case 1: return(A::$m($arg[0])); case 1: return(A::$m($arg[0],$arg[1]));... } } Mais c'est lourdingue Merci Modifié 12 Juillet 2008 par destroyedlolo
Kioob Posté 12 Juillet 2008 Posté 12 Juillet 2008 Hello, regarde du coté de la fonction call_user_func_array().
destroyedlolo Posté 12 Juillet 2008 Auteur Posté 12 Juillet 2008 Salut Kioob, regarde du coté de la fonction call_user_func_array(). Malheureusement ca ne fonctionne pas car dans je me prend l'erreur suivant : Fatal error: Using $this when not in object context (alors que ca fonctionne avec les switch/case). D'apres la doc des callback, ca ne fonctionne qu'avec les methodes statiques ou avec objets instancies et dans mon cas, ca ne peut etre ni l'un, ni l'autre (car je veux appliquees la methodes etrangeres de A sur un objet de type C).
Kioob Posté 13 Juillet 2008 Posté 13 Juillet 2008 (modifié) Hello, Je vois trois cas : 1) ta méthode est statique, dans ce cas tu passes : array( 'NomClasse', 'NomMethode' ) 2) ta méthode n'est pas statique, et tu fais l'appel depuis l'instance de l'objet : array( $this, 'NomMethode' ) 3) ta méthode n'est pas statique, et tu fais l'appel depuis l'extérieur : array( $objectInstance, 'NomMethode' ); Or de ce que je vois dans ton exemple, tu utilises ta classe A de manière statique uniquement. C'est à dire le premier cas. Pour faire du multiple en PHP5, dans le constructeur de ma classe C j'instancierais A et stockerais l'instance dans une propriété interne... la méthode __call utiliserait donc call_user_func_array() via un array( $this->instanceA, 'nomMethode' ); Si ça coince vraiment, donne un exemple de ton vrai code, et indique à quelle ligne correspond ton erreur sur le $this (je peux me tromper, mais j'ai l'impression que l'erreur est relative à une utilisation dans la méthode de A ; ce qui n'est pas forcément choquant dans ce contexte). Modifié 13 Juillet 2008 par Kioob
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant