我可以动态创建一个类名,然后用它在PHP中调用该类的静态函数吗


Can I dynamically create a class name and then use it to call static function of that class in PHP?

我有两个具有相同静态方法的类,但每个类都有不同的方法实现。在我的代码中,我知道需要调用哪个静态方法,但类类型是动态确定的。类似这样的东西:

class someClass_A {
    public static function bar(){
        //some implementation;
    }
    public static function foo(){
        //some implementation;
    }
}
class someClass_B {
     public static function bar(){
        //different implementation;
    }
    public static function foo(){
        //different implementation;
    }
}

我正试图以这种方式使用:

$class = 'someClass_' . $indicator;
$bar = $class::bar();

但它不起作用。我可以动态创建一个类名,然后用它来调用该类的静态函数吗?

您可以为此使用call_user_func_array。

class someClass_A {
    public static function bar() {
        return "I am the A-bar";
    }
    public static function foo() {
        return "I am the A-foo";
    }
}
class someClass_B {
    public static function bar() {
        return "I am the B-bar";
    }
    public static function foo() {
        return "I am the B-foo";
    }
}
$indicator = 'A';
$class = 'someClass_' . $indicator;
$aBar = call_user_func_array(array($class, 'bar'), array());
$indicator = 'B';
$class = 'someClass_' . $indicator;
$bFoo = call_user_func_array(array($class, 'foo'), array());
echo $aBar, PHP_EOL;
echo $bFoo, PHP_EOL;

输出:

I am the A-bar
I am the B-foo

更新

再说一遍,你的代码。。。

$class = 'someClass_' . $indicator;
$aBar = $class::bar();

实际上也应该起作用。只需记住在调用之前设置$indicator变量

$indicator = 'A';
$class = 'someClass_' . $indicator;
$aBar = $class::bar();
echo $aBar, PHP_EOL;

输出:

I am the A-bar