我想从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中的代码完成变得不可能。有什么提示吗?也许使用代码注释?
答案 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
是一个字符串。