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.
Utilisez la fonction call_user_func :
http://php.net/manual/en/function.call-user-func.php
Exemple:
call_user_func('myClassName_' . $language . '::myFunctionName');
Je pense que vous pourriez faire:
$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();
Cela s'appelle Fonctions variables
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();
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
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
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.
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> =
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()
.