[英]Proper phpdoc comment for iteratable object?
我在嘗試為以下代碼示例正確自動完成時遇到了一些問題。 我在 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
}
那么,關於如何解決這個問題的任何想法或基礎知識?
/**
* @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
您的
/** @var $object myObject */
塊確實是實現這一目標的正確方法。 您期望完成工作的語法,
/** * @var myObject[] */
不是標准的 phpdoc 符號,盡管它被非正式使用並且正在努力標准化。 在這種標准化確實發生之前,IDE 認識到它可能會失敗。 實際上,IDE 對 $object 本地 var 塊的覆蓋也是命中注定的。
在您的myCollection
類中,按如下方式覆蓋current()
:
/** @return myObject */
public function current() {
return parent::current();
}
可能的解決方法(也很丑陋)是創建靜態“構造函數”,它將返回 myObject。 至少它適用於日食。 如果您也想查看集合方法,只需添加 myCollection 以作為“@return myObject[]|myCollection”返回
class myCollection implements \IteratorAggregate
{
/**
* @return myObject[]
*/
public function create()
{
return new static();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.