Динамический статический вызов метода в PHP?

Пожалуйста, кто-нибудь, кто испытал в PHP, поможет в следующем. Где-то в моем коде у меня есть вызов общедоступного статического метода внутри неконкретизированного класса:

$result = myClassName::myFunctionName(); 

Тем не менее, я хотел бы иметь много таких классов и определять правильное имя класса на лету в соответствии с языком пользователя. Другими словами, у меня есть:

 $language = 'EN'; 

… и мне нужно сделать что-то вроде:

 $result = myClassName_EN::myFunctionName(); 

Я знаю, что могу передать язык в качестве параметра функции и разобраться с ним в одном общем классе, но по разным причинам я предпочел бы другое решение.

Это имеет смысл, кто-нибудь? Благодарю.

Используйте функцию call_user_func :

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

Пример:

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

Я бы инкапсулировал создание класса, который вам нужен на заводе.

Таким образом, у вас будет одна точка входа, когда вам нужно изменить свое базовое имя или правила для отображения языка в нужный класс.

  class YourClassFactory { private $_language; private $_basename = 'yourclass'; public YourClassFactory($language) { $this->_language = $language; } public function getYourClass() { return $this->_basename . '_' . $this->_language; } } 

и затем, когда вы должны использовать его:

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

Я думаю, вы могли бы сделать:

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

Это называется переменными функциями

Как сказал temuri, возникает ошибка синтаксического анализа при попытке «$ className :: functionName»:

Ошибка анализа: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM …

В моем случае (статический метод с двумя аргументами) лучшими решениями являются использование call_user_func_array с двумя массивами (как было предложено nikc.org):

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

BR

хотя я думаю, что вы имеете дело с очень плохой идеей, я думаю, что у меня может быть решение

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

я думаю, это то, что вы хотите

Насколько я понял ваш вопрос, вам нужно получить имя класса, которое можно выполнить с помощью функции get_class . С другой стороны, класс Reflection может помочь вам здесь, что отлично, когда дело доходит до методов, аргументов и т. Д. Способом OOP.

Решения, такие как:

 $yourClass::myFunctionName(); 

не будет работать. PHP создаст ошибку синтаксического анализа.

К сожалению, единственный способ – использовать очень медленный call_user_func() .

Вы можете легко сделать следующее:

 <?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 

И он будет отлично работать, проверен на PHP 5.2> =

Я знаю, что это старый поток, но с PHP 5.3.0 вы должны использовать forward_static_call

 $result = forward_static_call(array('myClassName_EN', 'myFunctionName')); 

Используя переменную $ language, она может выглядеть так:

 $result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));