【问题标题】:Phpdoc for variable "cast"?变量“演员”的Phpdoc?
【发布时间】:2018-04-09 14:31:01
【问题描述】:

基类:

abstract class A
{
    public function methodA() { echo __FUNCTION__.'<br>'; }
}

class B extends A
{
    public function methodB() { echo __FUNCTION__.'<br>'; }
}

到目前为止一切顺利。 可以创建其中任何一个的工厂:

class Factory
{
    /**
     * @return A
     */
    public static function createAorB()
    {
        return new B();
    }
}

phpdoc 是对的,因为它说“返回来自A 的东西”。 现在棘手的部分来了:

class OwnClass
{
    /**
     * @var A
     */
    protected $var;

    public function __construct()
    {
        $this->var = \Factory::createAorB();
    }
}

class OwnClassB extends OwnClass
{
    public function callMe()
    {
        $this->var->methodA();
        $this->var->methodB(); // this will also run, but IDE wont autocomplete with this method
    }
}

(new OwnClassB())->callMe();

这肯定会运行,但请检查methodB() 调用。 IDE 不会使用此方法自动完成。如何用 phpDoc 判断 var 现在是 B,而不是 A

【问题讨论】:

  • 当您返回B 时,不清楚@return A 实际上是如何正确的?如果您的protected $var 变量上有@var B,PHPStorm(至少)会正确地自动完成...(在 PHPStorm 中测试和证明。Lints 正确,并且通过这一更改正确地自动完成)。
  • @cale_b 这是正确的,因为AB 继承链的一部分。 phpdoc 只说该方法将返回一个符合类 A 定义的类。 B 这样做(因为它扩展了 A)。这也是 PHPStorm 不会自动完成的原因 - 因为你不能假设 methodB 从当前提示中存在。

标签: php phpdoc


【解决方案1】:

您可以覆盖 PHPStorm 自动完成的继承属性:

/**
 * @property B $var
 */
class OwnClassB extends OwnClass
{
    //...
}

但是,我个人认为您正在尝试解决错误的问题。如果您有一个返回 either AB 的 Factory 类,则不应将返回值提示输入 A。相反,您应该同时提供:

class Factory
{
    /**
     * @return A|B
     */
    public static function createAorB()
    {
        return new B();
    }
}

这两个选项都通知 PHPStorm 足以让它向您显示这两种方法作为自动完成选项,但后者在代码实际执行的方面是准确的(好吧,在这个例子中没有,但给定函数名,我猜这就是你的现实世界的实现确实如此)。

【讨论】:

  • 暗示 A 和 B 是错误的,因为它可能会返回一个未来的 C、D ....类
  • 好的,在这种情况下,提示A|B|C|D 会适得其反,因为您最终可能会得到很多实际上并不适用的自动完成选项。那么第一个选项可能是更好的选择。
猜你喜欢
  • 2014-08-15
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-02-11
  • 2022-08-20
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多