Tom*_*Tom 60 php class function dynamic
请有经验的PHP帮助以下人员.在我的代码中的某个地方,我在非实例化的类中调用了一个公共静态方法:
$result = myClassName::myFunctionName();
Run Code Online (Sandbox Code Playgroud)
但是,我希望有很多这样的类,并根据用户的语言动态确定正确的类名.换句话说,我有:
$language = 'EN';
Run Code Online (Sandbox Code Playgroud)
......我需要做一些事情:
$result = myClassName_EN::myFunctionName();
Run Code Online (Sandbox Code Playgroud)
我知道我可以将语言作为参数传递给函数并在一个公共类中处理它,但由于各种原因,我宁愿选择不同的解决方案.
这对任何人都有意义吗?谢谢.
Ben*_*ard 111
使用call_user_func函数:
http://php.net/manual/en/function.call-user-func.php
例:
call_user_func('myClassName_' . $language . '::myFunctionName');
Run Code Online (Sandbox Code Playgroud)
Ada*_*son 22
我想你可以这样做:
$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();
Run Code Online (Sandbox Code Playgroud)
这称为变量函数
Sil*_*ini 16
我会在工厂中封装你需要的类的创建.
这样,当您需要更改基本名称或将语言映射到正确的类的规则时,您将只有一个入口点.
class YourClassFactory {
private $_language;
private $_basename = 'yourclass';
public YourClassFactory($language) {
$this->_language = $language;
}
public function getYourClass() {
return $this->_basename . '_' . $this->_language;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当你必须使用它时:
$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();
Run Code Online (Sandbox Code Playgroud)
虽然我认为你处理的方式是一个非常糟糕的主意,但我想我可能有一个解决方案
$className = 'myClassName_'.$language;
$result = $className::myFunctionName();
Run Code Online (Sandbox Code Playgroud)
我想这就是你想要的
小智 6
正如temuri所说,在尝试'$ className :: functionName'时会产生解析错误:
解析错误:语法错误,意外T_PAAMAYIM_NEKUDOTAYIM ...
在我的例子中(带有2个参数的静态方法),最好的解决方案是使用带有2个数组的call_user_func_array(如nikc.org所建议的):
$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
Run Code Online (Sandbox Code Playgroud)
BR