【问题标题】:How to tell PhpStorm type of variable with abstract factory method?如何用抽象工厂方法告诉 PhpStorm 变量的类型?
【发布时间】:2015-08-19 20:59:53
【问题描述】:

我有一个这样的抽象类

abstract class AbstractClass
{
    /** 
     * @return AbstractClass
     */ 
    public static function forge($data)
    {
        return new static($data);
    }
}

以及另一个继承它的类

class OtherClass extends AbstractClass
{
    public function my_method()
    {
        echo 'hello';
    }
}

当我打电话时

$otherClass = OtherClass::forge($otherclass_data);

PhpStorm 不会自动补全my_method(),实际上会弹出一个错误:

Method 'my_method' not found in class 'AbstractClass'

有什么方法可以让 PhpStorm 知道我伪造了 OtherClass,而不是 AbstractClass

【问题讨论】:

  • .. 但是您的 forge 方法无论如何都不会返回任何内容...另外,在静态方法中使用 $this...
  • 你是对的,写了一个简单的例子,我已经编辑了它以使我的问题更清楚
  • 不确定你在哪里得到这个错误?我运行了您的示例,它给出的警告与类抽象无关。它不会自动完成OtherClass::my_method,因为 my_method 不是静态的,不应该被静态引用。如果你实例化一个OtherClass,例如$otherClass = new OtherClass(); 并输入$otherClass->,它将给出forgemo_method 的自动完成建议。您能否提供一个实际导致该错误的示例?

标签: php phpstorm jetbrains-ide


【解决方案1】:

在这种情况下使用@return static,例如

abstract class AbstractClass
{
    /** 
     * @return static
     */ 
    public static function forge($data)
    {
        return new static($data);
    }
}

这样会解析到调用类。

附言 同样@return $this 可以用于非静态方法。

附言 请注意,在一些不那么简单的情况下(例如,在另一个也使用这种方法的类的另一种方法中使用具有 @return(静态或 $this)的类的某些方法)可能会导致 IDE 混淆,这将产生错误警告——这是一个 IDE 问题,希望能在未来的某个版本中得到解决。

【讨论】:

  • 啊,在我的情况下,ide 似乎很混乱。
猜你喜欢
  • 2011-01-05
  • 2014-01-14
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多