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

Я использую 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, и было бы полезно знать методы и свойства класса.

Наверняка есть более простой способ...


person Nick    schedule 26.01.2012    source источник


Ответы (2)


Я не могу сказать, как это работает в 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
    }
}
person Dan Soap    schedule 26.01.2012
comment
@Nick попробуйте сейчас, в свойствах объекта NetBeans задокументированы без имени переменной, только @var и тип. - person dev-null-dweller; 26.01.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'), поскольку эти два вызова, скорее всего, вернут объекты разных типов.

person drew010    schedule 26.01.2012