从PHP中的另一个类属性调用变量类的静态方法


Call static method of variable class from anothers class property in PHP

我想从PHP中的变量类调用静态方法。正如在SO上多次指出的那样,由于这是一般做法,因此以下操作按预期工作:

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

尽管如此,我必须从类Foo的不同方法中调用$strClass的不同查找方法。这就是为什么我要将$strClass存储在$this->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中的代码完成是不可能的。有什么提示吗?也许使用代码注释?

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

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

这个类设计是有缺陷的。我会尝试完全摆脱静态方法,但这里有一个解决方案,它利用了您可以在对象上调用静态方法的事实:

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是一个字符串。