Как я могу использовать подсказки docblock с классами для переменных $ this? - PullRequest
1 голос
/ 26 января 2012

Я использую NetBeans в качестве своей IDE.Всякий раз, когда у меня есть код, который использует другую функцию (обычно фабрику) для возврата объекта, обычно я могу сделать следующее, чтобы помочь с подсказкой:

/* @var $object FooClass */
$object = $someFunction->get('BarContext.FooClass');
$object-> // now will produce property and function hints for FooClass.

Однако, когда я использую свойство объекта для хранения этогокласс, я немного растерялся, как сделать то же самое, так как trying to use @var $this->foo or @var foo не будет переносить подсказку через:

use Path\To\FooClass;

class Bar
{
    protected $foo;

    public function bat()
    {
        $this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass

        $this->foo //does not have hinting in IDE
    }
}

Я пытался в docblock для класса, или используявстроенные комментарии выше protected $foo или где foo установлена ​​для экземпляра.

Единственный обходной путь, который я нашел до сих пор, заключается в следующем:

public function bat()
{
    $this->foo = FactoryClass::get('Foo');

    /* @var $extraVariable FooClass */
    $extraVariable = $this->foo;

    $extraVariable-> // now has hinting.
}

Я бы очень хотел, чтобы подсказка былаОднако для всего класса многие другие функции могут потенциально использовать $this->foo, и знание методов и свойств класса было бы полезно.

Конечно, есть более простой способ ...

Ответы [ 2 ]

5 голосов
/ 26 января 2012

Я не могу сказать, как это работает в Netbeans, но в PHPEclipse вы бы добавили подсказку к объявлению самой переменной:

use Path\To\FooClass;

class Bar
{
    /**
     * @var FooClass
     */
    protected $foo;

    public function bat()
    {
        $this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass

        $this->foo // should now have hinting
    }
}
1 голос
/ 26 января 2012

С учетом

class Bar
{
    protected $foo;

    public function bat()
    {
        $this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass

        $this->foo //does not have hinting in IDE
    }
}

IDE пытается получить объявление из FactoryClass::get, которое, вероятно, не имеет типа возврата docblock. Проблема в том, что если этот метод фабрики может вернуть любое количество классов, вы ничего не можете сделать, кроме как использовать обходной путь.

В противном случае он не будет знать разницу между FactoryClass::get('Foo') или FactoryClass::get('Bar'), поскольку эти два вызова, скорее всего, будут возвращать объекты разных типов.

...