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

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)

  • 结合`is_callable`和`method_exists`,这也是我的建议.要传递参数,请查看`call_user_func_array` http://php.net/is_callable http://php.net/method_exists http://php.net/call_user_func_array (26认同)

Ada*_*son 22

你可以这样做:

$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();
Run Code Online (Sandbox Code Playgroud)

这称为变量函数

  • 这太糟糕了,这只适用于> = 5.3.0 :( (4认同)

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)


mar*_*vin 6

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

$className = 'myClassName_'.$language;
$result = $className::myFunctionName();
Run Code Online (Sandbox Code Playgroud)

我想这就是你想要的

  • 只是一个注意事项:这仅适用于php 5.3 - 更好地检查您的主机提供商是否支持该版本(我正在使用的那个版本不支持). (3认同)

小智 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