PHP中的动态静态方法调用?

时间:2010-01-21 11:29:04

标签: php class function dynamic

请有经验的PHP人员帮助解决以下问题。在我的代码中的某个地方,我在非实例化的类中调用了一个公共静态方法:

$result = myClassName::myFunctionName();

但是,我希望有很多这样的类,并根据用户的语言动态确定正确的类名。换句话说,我有:

$language = 'EN';

......我需要做类似的事情:

$result = myClassName_EN::myFunctionName();

我知道我可以将语言作为参数传递给函数并在一个常见的类中处理它,但出于各种原因,我宁愿选择不同的解决方案。

这对任何人都有意义吗?感谢。

9 个答案:

答案 0 :(得分:105)

使用call_user_func功能:

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

示例:

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

答案 1 :(得分:18)

认为你能做到:

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

这称为Variable Functions

答案 2 :(得分:15)

我会在工厂中封装你需要的类的创建。

这样,当您需要更改基本名称或将语言映射到正确的类的规则时,您将只有一个入口点。

    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();

答案 3 :(得分:6)

虽然我认为你处理的方式是一个非常糟糕的主意,我想我可能有一个解决方案

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

我认为这就是你想要的

答案 4 :(得分:6)

正如temuri所说,在尝试'$ className :: functionName'时会产生解析错误:

  

解析错误:语法错误,意外T_PAAMAYIM_NEKUDOTAYIM ...

在我的情况下(带有2个参数的静态方法),最佳解决方案是使用call_user_func_array和2个数组(如nikc.org所建议):

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

BR

答案 5 :(得分:1)

据我所知,你需要获得可以使用get_class函数完成的类名。另一方面,Reflection class可以在这里帮助你,这在OOP方式中对于方法,参数等是很好的。

答案 6 :(得分:1)

您可以轻松完成下一步:

<?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&gt; =

上测试

答案 7 :(得分:0)

解决方案如:

$yourClass::myFunctionName();

不起作用。 PHP将产生解析错误。

不幸的是,唯一的方法是使用非常慢 call_user_func()

答案 8 :(得分:-1)

我知道它是一个旧线程,但从PHP 5.3.0开始,你应该使用forward_static_call

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

使用您的$ language变量,它可能如下所示:

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