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

可迭代对象的正确phpdoc注释?,php,interface,iterator,aggregate,phpdoc,Php,Interface,Iterator,Aggregate,Phpdoc,我在为下面的代码示例获取正确的自动完成时遇到了一些问题。我正在Win7机器上使用PHPStorm 7 首先是一个简单的类 /** * Class myObject */ class myObject { /** * some method */ public function myMethod() { // do something } } 这是一个集合类,它可以包含前一个类的多个实例,并实现IteratorAggrega

我在为下面的代码示例获取正确的自动完成时遇到了一些问题。我正在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
}
那么,关于如何解决这个问题有什么想法或基本知识吗?

你的

/**@var$object myObject*/

块确实是实现这一点的正确方法。您希望执行此工作的语法

/**
*@var myObject[]
*/

不是标准的phpdoc符号,尽管它是非正式使用的,并且正在进行一些标准化工作。在这种标准化真正实现之前,IDE认识到这一点很可能是碰运气。实际上,$object local var块的IDE覆盖率也是命中或未命中。

可能的解决方法(也很难看)是创建静态“构造函数”,它将返回myObject。至少它可以在eclipse中工作。如果您也想查看收集方法,那么只需将myCollection添加为“@return myObject[]| myCollection”返回即可


在您的
myCollection
类中,重写
current()
,如下所示:

/** @return myObject */
public function current() {
    return parent::current();
}
对于扩展类(基类在上面):

/**
*@method iterable getIterator()
*/
类ExtendedClass扩展BaseCollection
{
}

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

可能是因为ArrayIterator的返回值是混合的,但我不确定PHPStorm是否可以处理迭代的值。试着创建一个自己的迭代器,返回您的对象或接口,看看IDE是否可以处理这个问题。最后,尝试自己的迭代器可能会增加项目的开销,所以@var应该可以。
/** @return myObject */
public function current() {
    return parent::current();
}
/**
 * @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
{
}