是否为可迭代对象添加正确的phpdoc注释?

2022-03-02 00:00:00 aggregate iterator interface php phpdoc

我在尝试为下面的代码示例获取正确的自动完成时遇到了一些问题。我正在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一起使用

相关文章