可迭代对象的正确phpdoc注释?
我在为下面的代码示例获取正确的自动完成时遇到了一些问题。我正在Win7机器上使用PHPStorm 7 首先是一个简单的类可迭代对象的正确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
/**
* 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
{
}