可迭代对象的正确 phpdoc 注释?

use*_*674 8 php iterator aggregate interface phpdoc

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

首先只是一个简单的类。

/**
 * Class myObject
 */
class myObject
{
    /**
     * some method
     */
    public function myMethod()
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个集合类,它可以包含先前类的多个实例并实现 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是代码示例。

$collection = new myCollection;

$collection->add(new myObject);
$collection->add(new myObject);

foreach ($collection as $object) {
    $object->myMethod(); // gets no autocompletion
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 7

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

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

/**
 * @method myObject[] getIterator()
 */
class ExtendedClass extends BaseCollection
{
}
Run Code Online (Sandbox Code Playgroud)

或者

/**
 * @method iterable<myObject> getIterator()
 */
class ExtendedClass extends BaseCollection
{
}
Run Code Online (Sandbox Code Playgroud)

我认为这将是处理这种情况的最佳方式。至少它适用于 PHPStorm


ash*_*azg 1

你的

/** @var $object myObject */

block 确实是实现这一目标的正确方法。您期望完成工作的语法,

/** * @var myObject[] */

不是标准的 phpdoc 表示法,尽管它已被非正式使用并且正在进行一些标准化工作。在这种标准化真正实现之前,IDE 认识到这一点可能会是偶然的。实际上,IDE 对 $object local var 块的覆盖也是偶然的。