【问题标题】:Call static method of variable class from anothers class property in PHP从 PHP 中的另一个类属性调用变量类的静态方法
【发布时间】:2015-07-22 06:43:50
【问题描述】:

我想从 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
    }

}

关于如何解决该问题的任何想法或提示?

更新:

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

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

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

【问题讨论】:

  • 如果{$this->strClass}::find() 可以工作,PHPStorm 代码完成应该如何知道$this->strClass运行时值
  • 我希望可以告诉 PHPstorm 可能存储在 $this->strClass 中的所有类都将具有相同的父类,例如/** @type Model $this->strClass */ (不工作)

标签: php oop static-methods


【解决方案1】:

你可以把你的编译方法改成这样:

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

【讨论】:

  • 谢谢,这可行,但我希望有更好的解决方案:)
【解决方案2】:

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

class Foo {

    protected $strClass;

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

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

}

更新:没关系,这是所有当前 PHP 版本中的语法错误,您实际上必须这样做:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多