web-dev-qa-db-fra.com

Appel de méthode statique dynamique en PHP?

Veuillez quelqu'un expérimenté en PHP aider avec ce qui suit. Quelque part dans mon code, j'ai un appel à une méthode statique publique à l'intérieur d'une classe non instanciée:

$result = myClassName::myFunctionName();

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

$language = 'EN';

... et je dois faire quelque chose comme:

$result = myClassName_EN::myFunctionName();

Je sais que je pourrais transmettre le langage en tant que paramètre à la fonction et le traiter dans une seule classe commune, mais pour diverses raisons, je préférerais une solution différente.

Est-ce que cela a du sens, n'importe qui? Merci.

58
Tom

Utilisez la fonction call_user_func :

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

Exemple:

call_user_func('myClassName_' . $language . '::myFunctionName');
107
Ben Everard

Je pense que vous pourriez faire:

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

Cela s'appelle Fonctions variables

20
Adam Hopkinson

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

De cette façon, vous aurez un point d'entrée unique lorsque vous devrez modifier votre nom de 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;
        }    
    } 

puis, quand vous devez l'utiliser:

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

Comme l'a dit temuri, une erreur d'analyse est produite lors de l'essai de '$ className :: functionName':

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

Dans mon cas (méthode statique avec 2 arguments), la meilleure solution consiste à utiliser call_user_func_array avec 2 tableaux (comme suggéré par nikc.org):

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

BR

6
Dimcho

bien que je pense que la façon dont vous traitez est une très mauvaise idée, je pense que j'ai peut-être une solution

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

je pense que c'est ce que tu veux

6
marvin

Pour autant que je puisse comprendre votre question, vous devez obtenir le nom de classe qui peut être fait en utilisant la fonction get_class . D'un autre côté, la classe de réflexion peut vous aider ici, ce qui est génial en ce qui concerne les méthodes, les arguments, etc. de la manière OOP.

1
Sarfraz

Vous pouvez facilement faire ensuite:

<?php

class B {

    public static $t = 5;

    public static function t($h) {
        return "Works!" . $h;
    }
}

$g = 't';
$class = 'B';

echo $class::$g('yes'); //Works! Yes

Et cela fonctionnera très bien, testé sur PHP 5.2> =

1
KorbenDallas

Des solutions comme:

$yourClass::myFunctionName();

ne fonctionnera pas. PHP produira une erreur d'analyse.

Malheureusement, la seule façon est d'utiliser très lentcall_user_func().

0
temuri