【问题标题】:PHP: Why does @var $foo Class work and @var $this->foo Class not?PHP:为什么@var $foo 类有效而@var $this->foo 类无效?
【发布时间】:2019-02-10 05:06:31
【问题描述】:

为什么会这样:

/* @var $foo ClassName */
$foo->someFunction();

但这个不是:

/* @var $this->foo ClassName */
$this->foo->someFunction();

这是完整的设置:

abstract class Bar
{
  $foo = null;
}


class Cool
{
  // some function sets $this->foo

  public function doSthWithFoo() // does not work
  {
    /* @var $this->foo ClassName */
    $this->foo->someFunction();
  }

  public function doSthWithFoo2() // works just fine
  {
    $test = $this->foo
    /* @var $test ClassName */
    $test->someFunction();
  }
}

另一种方法是在新类中再次定义 $foo 变量:

class Cool
{
  /* @var $foo ClassName */
  $foo = null;

  // ...
}

当然,PHP 代码执行正确,但 PHPDoc 有问题。

(PhpStorm 2018.2.2)


提前致谢!

【问题讨论】:

  • Docblock 抽象类,这应该会给你更好的结果
  • “但是 PHPDoc 有问题。” 这不是问题。您只是想创建自己的 PHPDoc 应该如何工作的规则。但它不是那样工作的——就这么简单。您不能使用 @var 输入特定的子实体 - 只能是顶级/整个实体。所以这就是戴尔所说的......或者你可以在你的Cool类中尝试@property标签。
  • @Dale / @LazyOne:是的,但在这种情况下这是不可能的。在这种情况下,抽象类的$foo 属性在类继承它并设置其特定类型之前没有类型。目的是“强制”使用继承的$foo 属性,而不是创建许多不同的属性......(但正如你所说,这超出了这个问题)@LazyOne:你说得对,PHPDoc 不是错误的,但它会如果可行,那就太棒了。
  • 查看 phpstorm.meta 文件,它们可能不是解决方案,但我相信它们可能会有所帮助,我会尝试为您获取链接

标签: php annotations phpstorm phpdoc


【解决方案1】:

我不能直接回答你的问题,因为我不知道为什么这不起作用,但我通常这样做是为了解决这种情况

<?php

class foo
{
    /** @var SomeClass $foo */
    protected $foo;

    // the rest of the class
}

现在您应该为$this-&gt;foo-&gt;availableThings() 获得正确的代码完成

【讨论】:

  • 是的,那行得通。我想我应该调整答案,对不起:它是一个继承自具有 $foo 属性的抽象类的类。当然我可以在新课中再次提到它,但是 PHPDoc 应该明白这一点,对吧?
  • 我不确定说实话,有时我会阻止属性,但是在使用它时,函数会返回一些未知类型并且代码完成丢失。我还有其他风暴 2018.2 问题.2 但这超出了这个问题。
  • @FloBayer 抽象类的文档是否正确?
【解决方案2】:

我想用下面的代码来解释一下:

class Foo
{
    public function myFooFunction()
    {
        return 'this is foo function';
    }
}

class Bar
{
    public $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function myBarFoonction()
    {
        return 'this is bar function';
    }
}

$foo = new Foo();
echo $foo->myFooFunction(); //call in Foo object

$bar = new Bar($foo);
echo $bar->myBarFoonction(); // call in Bar object
echo $bar->foo->myFooFunction(); // call in Foo object 

如果您调用$bar-&gt;foo - 您必须调用该对象中的函数

【讨论】:

  • 我认为 OP 了解如何做到这一点,但质疑为什么 PHPStorm 无法提供正确的代码完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2013-12-08
  • 2013-11-17
相关资源
最近更新 更多