对于itteratable对象有适当的phpdoc评论吗?

时间:2014-03-08 17:00:01

标签: php interface iterator aggregate phpdoc

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

首先只是一个简单的课程。

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

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

/**
 * 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
}

那么,关于如何解决这个问题的任何想法或基本知识?

4 个答案:

答案 0 :(得分:3)

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

我认为这是处理这种情况的最佳方法。至少与PHPStorm兼容

答案 1 :(得分:1)

你的

/** @var $object myObject */

块确实是实现此目的的正确方法。您期望完成工作的语法,

/** * @var myObject[] */

不是标准的phpdoc表示法,虽然它是非正式使用的,并且正在进行一些标准化工作。在这种标准化确实发生之前,识别它的IDE可能会被击中或者错过。实际上,$ object local var block的IDE覆盖率也是命中注定。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

myCollection班级中,按以下方式覆盖current()

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