59 votes

Appel dynamique de méthode statique en PHP ?

Quelqu'un d'expérimenté en PHP pourrait-il m'aider à résoudre le problème suivant ? Quelque part dans mon code, j'ai un appel à une méthode statique publique dans une classe non initialisée :

$result = myClassName::myFunctionName();

Cependant, j'aimerais disposer de plusieurs classes de ce type et déterminer à la volée le nom de classe correct en fonction de la langue de l'utilisateur. En d'autres termes, j'ai :

$language = 'EN';

... et j'ai besoin de faire quelque chose comme :

$result = myClassName_EN::myFunctionName();

Je sais que je pourrais passer la langue en tant que paramètre à la fonction et la traiter dans une seule classe commune, mais pour diverses raisons, je préférerais une autre solution.

Est-ce que ça a un sens, quelqu'un ? Merci.

110voto

Ben Everard Points 8295

Utilisez le appel_utilisateur_func fonction :

http://php.net/manual/en/function.call-user-func.php

Exemple :

call_user_func('myClassName_' . $language . '::myFunctionName');

21voto

Adam Hopkinson Points 16747

I pensez à que vous pourriez faire :

$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();

C'est ce qu'on appelle Fonctions variables

16voto

Silvio Donnini Points 1526

J'encapsulerais la création de la classe dont vous avez besoin dans une usine.

Vous disposerez ainsi d'un point d'entrée unique lorsque vous devrez modifier le nom de votre base ou les règles de mappage de la langue à la bonne classe.

    class YourClassFactory {

        private $_language;
        private $_basename = 'yourclass';

        public YourClassFactory($language) {
            $this->_language = $language;
        }

        public function getYourClass() {
            return $this->_basename . '_' . $this->_language;
        }    
    } 

et ensuite, quand vous devez l'utiliser :

$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();

6voto

Dimcho Points 71

Comme l'a dit temuri, une erreur d'analyse est produite lorsque l'on essaie '$className::functionName' :

Erreur d'analyse : erreur de syntaxe, inattendu T_PAAMAYIM_NEKUDOTAYIM ...

Dans mon cas (méthode statique avec 2 arguments), la meilleure solution est d'utiliser la méthode suivante appel_utilisateur_func_array avec 2 tableaux (comme suggéré par nikc.org) :

$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));

BR

6voto

marvin Points 2517

Bien que je pense que la façon dont vous traitez est une très mauvaise idée, je pense avoir une solution.

$className = 'myClassName_'.$language;
$result = $className::myFunctionName();

Je pense que c'est ce que vous voulez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X