php / phpDoc - @возвращает экземпляр $this класса?

как отметить метод как "возвращает экземпляр текущего класса" в моем phpDoc?

в следующем примере моя IDE (Netbeans) увидит, что setSomething всегда возвращает

4 ответов


обновление:

начиная с Netbeans 7.4, IDE поддерживает @return self, static и this (http://wiki.netbeans.org/NewAndNoteworthyNB74#Editor_2).

class foo {
    protected $_value = null;

    /**
     * Set something
     *
     * @param string $value the value
     * @return this
     */
    public function setSomething($value) {
        $this->_value = $value;
        return $this;
    }
}

class bar extends foo {
    public function someOtherMethod(){}
}

Предыдущий Ответ:

у нас есть аналогичная проблема с записью итератора current() метод. Поскольку итератор расширен для многих разных классов, нет смысла иметь @return $class связанные с ним. Мы использовали Вариант 2 @satrun77 раньше, но я использовал @method С некоторым успехом в Netbeans.

class foo {
    protected $_value = null;

    /**
     * Set something
     *
     * @param string $value the value
     * @return foo
     */
    public function setSomething($value) {
        $this->_value = $value;
        return $this;
    }
}

/**
 * @method bar setSomething($value)
 */
class bar extends foo {
    public function someOtherMethod(){}
}

думал, что я вернусь к этому Q, когда наткнусь на пару вещей.

В настоящее время" return $this " не поддерживается, но есть запрос PhpDoc, чтобы добавить именно это в v1.5:

http://pear.php.net/bugs/bug.php?id=16223

в Eclipse PDT Также есть запрос на это:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=276082

оба являются относительно старыми запросами. Я не собираюсь становиться слишком взволнован тем, что это будет реализовано в ближайшее время, но здесь идет надежда :) тем временем, похоже, нет правильного решения этой проблемы.


здесь 3 обойти: (Это просто работа вокруг. классы не должны быть разработаны и реализованы, чтобы подать в суд на поведение IDE)

Вариант 1: сделайте метод someOtherMethod абстрактным или пустым методом в классе foo

class foo implements ifoo {
    protected $_value = null;

    /**
     * Set something
     *
     * @param string $value the value
     * @return ifoo
     */
    public function setSomething($value) {
        $this->_value = $value;
        return $this;
    }

    // abstract method or create empty method if you want the method to be
    // to be optional 
    abstract function someOtherMethod();
}

Вариант 2:

переопределить метод setSomething в классе bar

class bar extends foo {
    /**
     *
     * @param <type> $value
     * @return bar
     */
    public function setSomething($value) {
        return parent::setSomething($value); 
    }

    public function someOtherMethod(){}
}

Вариант 3: Интерфейс

interface ifoo {
    public function someOtherMethod(){}
}

class foo {
    protected $_value = null;

    /**
     * Set something
     *
     * @param string $value the value
     * @return ifoo
     */
    public function setSomething($value) {
        $this->_value = $value;
        return $this;
    }
}

class bar extends foo implements ifoo {

    public function someOtherMethod(){}
}

синтаксис phpDoc позволяет определять несколько типов, разделяя их с помощью | символ @return tag. Когда вы расширяете class foo С class bar вы должны написать новый тег phpDoc, который имеет надлежащий класс для @return.

если функция возвращает значение foo или bar затем вы должны использовать @return foo|bar.

однако в вашем случае просто определите @return bar для переопределения функции.

позаботиться.