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