从PHP中的其他类属性调用变量类的静态方法

时间:2015-07-22 06:43:51

标签: php oop static-methods

我想从PHP中的一个变量类调用一个静态方法。正如在SO上多次指出并且因为它是一般做法,以下工作如预期的那样:

class Foo {
    public function compile($strClass) {
        $strClass::find(); // this works
    }
}

尽管如此,我必须从类Foo的不同方法中调用$ strClass中的不同find方法。也就是说,为什么我想在$ this-> strClass中存储$ strClass。不幸的是,这不起作用:

class Foo {

    protected $strClass;

    public function __construct($strClass) 
    {
         $this->strClass = $strClass;
    }

    public function compile($strClass) {
        $this->strClass::find(); // this does not work
    }

}

有关如何解决该问题的任何想法或暗示?

更新:

正如评论中指出的那样,使用call_user_func可能是一个解决方案:

call_user_func(array($this->strClass, 'find'), $strParam);

无论如何,这使得PHPstorm中的代码完成变得不可能。有什么提示吗?也许使用代码注释?

2 个答案:

答案 0 :(得分:1)

您可以将编译方法更改为:

public function compile($strClass) {
    call_user_func(array($this->strClass, 'find'));
}

答案 1 :(得分:0)

这个班级设计存在缺陷。我会尝试完全摆脱静态方法,但这是一个利用你可以在对象上调用静态方法这一事实的解决方案:

class Foo {

    protected $strClass;

    public function __construct($strClass) 
    {
         $this->strClass = new $strClass;
    }

    public function compile($strClass) {
        $this->strClass::find();
    }

}

UPDATE:从来没有,这是所有当前PHP版本中的语法错误,您实际上必须这样做:

$strClass = $this->strClass;
$strClass::find();

这也适用于您的原始代码,其中$this->strClass是一个字符串。