在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'));