簡體   English   中英

可迭代對象的正確 phpdoc 注釋?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM