Динамический статический вызов метода в PHP?
Пожалуйста, кто-нибудь, имеющий опыт в PHP, может помочь со следующим. Где-то в моем коде у меня есть вызов общедоступного статического метода внутри неинстанцированного класса:
$result = myClassName::myFunctionName();
Тем не менее, я хотел бы иметь много таких классов и определить правильное имя класса на лету в соответствии с языком пользователя. Другими словами, у меня есть:
$language = 'EN';
... и мне нужно сделать что-то вроде:
$result = myClassName_EN::myFunctionName();
Я знаю, что мог бы передать язык в качестве параметра функции и работать с ним только в одном общем классе, но по разным причинам я бы предпочел другое решение.
Кто-нибудь имеет в этом смысл? Благодарю.
9 ответов
Используйте функцию call_user_func:
http://php.net/manual/en/function.call-user-func.php
Пример:
call_user_func('myClassName_' . $language . '::myFunctionName');
Я думаю, что вы могли бы сделать:
$classname = 'myClassName_' . $language;
$result = $classname::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::functionName' выдается ошибка разбора:
Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM ...
В моем случае (статический метод с 2 аргументами) наилучшим решением является использование http://md1.php.net/call_user_func_array с 2 массивами (как предложено nikc.org):
$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
BR
Хотя я думаю, что вы имеете дело с очень плохой идеей, я думаю, что у меня может быть решение
$className = 'myClassName_'.$language;
$result = $className::myFunctionName();
я думаю это то что ты хочешь
Вы можете легко сделать следующее:
<?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 >=
Насколько я мог понять ваш вопрос, вам нужно получить имя класса, что можно сделать с помощью функции get_class. С другой стороны, класс Reflection может помочь вам в этом, что замечательно, когда речь идет о методах, аргументах и т. Д. ООП.
Решения, такие как:
$yourClass::myFunctionName();
не будет работать. PHP выдаст ошибку разбора.
К сожалению, единственный способ использовать очень медленно call_user_func()
,
Я знаю, что это старый поток, но с PHP 5.3.0 вы должны использовать forward_static_call
$result = forward_static_call(array('myClassName_EN', 'myFunctionName'));
Используя переменную $language, она может выглядеть так:
$result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));