PHP:为什么@var $ foo类起作用而@var $ this-> foo类不能起作用?

时间:2018-09-05 06:37:36

标签: php annotations phpstorm phpdoc

为什么这样做:

/* @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)


谢谢!

2 个答案:

答案 0 :(得分:1)

我无法直接回答您的问题,因为我不知道为什么这不起作用,但是我通常会这样做以解决情况

<?php

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

    // the rest of the class
}

现在您应该为$this->foo->availableThings()

获得正确的代码完成

答案 1 :(得分:0)

我想尝试通过以下代码进行解释:

ENOENT

如果您调用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 -您必须在该对象中调用function