适用于可迭代对象的phpdoc注释


Proper phpdoc comment for iteratable object?

我在尝试为以下代码示例获得正确的自动补全时遇到了一些问题。我在Win7机器上使用PHPStorm 7。

首先只是一节简单的课。

/**
 * Class myObject
 */
class myObject
{
    /**
     * some method
     */
    public function myMethod()
    {
        // do something
    }
}

这是一个集合类,它可以包含先前类的多个实例,并实现IteratorAggregate接口。

/**
 * Class myCollection
 */
class myCollection implements IteratorAggregate
{
    /**
     * @var myObject[]
     */
    protected $_objects = array();

    /**
     * @param myObject $object
     * @return myCollection
     */
    public function add(myObject $object)
    {
        $this->_objects[] = $object;
        return $this;
    }

    /**
     * @return ArrayIterator
     */
    public function getIterator()
    {
        return new ArrayIterator($this->_objects);
    }
}

下面是代码示例。

$collection = new myCollection;
$collection->add(new myObject);
$collection->add(new myObject);
foreach ($collection as $object) {
    $object->myMethod(); // gets no autocompletion
}

正如您可能已经猜到的(并在示例中阅读到的(,myMethod()调用不会自动完成,而是直接列在代码分析中。我找到的唯一方法是为$object添加一个评论块,老实说,我觉得这非常烦人。

/** @var $object myObject */
foreach ($collection as $object) {
    $object->myMethod(); // gets autocompletion now, but sucks
}

那么,关于如何解决这个问题,有什么想法或基础知识吗?

/**
 * @return ArrayIterator|myObject[]
 */
public function getIterator()
{
    return new ArrayIterator($this->_objects);
}

对于扩展类(基类在上面(:

/**
 * @method myObject[] getIterator()
 */
class ExtendedClass extends BaseCollection
{
}

/**
 * @method iterable<myObject> getIterator()
 */
class ExtendedClass extends BaseCollection
{
}

我认为这将是处理此类案件的最佳方式。至少它能与PHPStorm 一起工作

您的

/** @var $object myObject */

块确实是实现这一点的正确方法。你期望完成工作的语法,

/** * @var myObject[] */

不是标准的phpdoc表示法,尽管它是非正式使用的,并且正在进行一些标准化工作。在这样的标准化实现之前,识别它的IDE可能会碰运气。事实上,$object本地var块的IDE覆盖率也是偶然的。

myCollection类中,按如下方式覆盖current()

/** @return myObject */
public function current() {
    return parent::current();
}

可能的解决方法(也是丑陋的(是创建静态"构造函数",它将返回myObject。至少它在eclipse中有效。如果你也想看到收集方法,那么只需添加myCollection以返回为"@return myObject[]| myCollection">

class myCollection implements 'IteratorAggregate
{
    /**
     * @return myObject[]
     */
    public function create()
    {
        return new static();
    }
}