Aller au contenu

Convertir un tableau en liste d'argument.


Sujets conseillés

Posté (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 :mad2:

Merci

Modifié par destroyedlolo
Posté

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).

Posté (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é par Kioob

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...