在PHP中dynamic静态方法调用?
请有经验的人可以帮助下面的PHP。 在我的代码中的某处,我调用了一个非实例化类中的公共静态方法:
$result = myClassName::myFunctionName();
但是,我想要有很多这样的类,根据用户的语言来确定正确的类名。 换句话说,我有:
$language = 'EN';
…我需要做一些事情:
$result = myClassName_EN::myFunctionName();
我知道我可以将语言作为parameter passing给函数,并在一个普通的类中处理它,但由于各种原因,我更喜欢不同的解决scheme。
这是否有任何意义,任何人? 谢谢。
使用call_user_func函数:
http://php.net/manual/en/function.call-user-func.php
例:
call_user_func('myClassName_' . $language . '::myFunctionName');
我将在工厂中封装你需要的类的创build。
这样,当您需要更改您的基本名称或将语言映射到正确的类别的规则时,您将拥有一个入口点。
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();
这被称为variables函数
正如temuri所说的,当尝试'$ className :: functionName'时会产生parsing错误:
parsing错误:语法错误,意外T_PAAMAYIM_NEKUDOTAYIM …
在我的情况下(有2个参数的静态方法),最好的解决scheme是使用call_user_func_array和2个数组(如nikc.org所示):
$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
BR
虽然我认为你的交易方式是一个非常糟糕的主意,我想我可能有一个解决scheme
$className = 'myClassName_'.$language; $result = $className::myFunctionName();
我认为这是你想要的
据我了解你的问题,你需要获得可以使用get_class函数完成的类名称。 另一方面, Reflection类可以帮助你,在面向对象的方法,参数等方面是非常棒的。
解决scheme如:
$yourClass::myFunctionName();
不pipe用。 PHP将产生parsing错误。
不幸的是,唯一的方法是使用非常慢的 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> =testing
我知道这是一个古老的线程,但是从PHP 5.3.0开始,您应该使用forward_static_call
$result = forward_static_call(array('myClassName_EN', 'myFunctionName'));
使用你的$语言variables,它可能看起来像:
$result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));