Подсказка кода PHPStorm для массива массивов объектов

В PHPStorm подсказка кода для массива объектов проста и великолепна;

class FooList {
    public function __construct(){
        $this->_fooList[] = new Foo(1);
        $this->_fooList[] = new Foo(2);
        $this->_fooList[] = new Foo(3);
        $this->_fooList[] = new Foo(4);
    }

    /**
     * @return Foo[]
     */
    getFoos() {
        return $this->_fooList;
    }
}

Так что если я сделаю...

$fooList = new FooList();

foreach($fooList as $foo)
{
    // Nice hinting.
    $foo->FooMethod...
}

PHPStorm понимает, что $fooList является массивом Foos, и поэтому знает, что типом $foo является Foo.

Проблема в том, что я хочу массив FooList.

$listOfLists[] = new FooList();
$listOfLists[] = new FooList();
$listOfLists[] = new FooList();
$listOfLists[] = new FooList();

foreach ($listOfLists as $fooList)
{
    foreach($fooList as $foo)
    {
        // No code hinting for $foo :(
    }
}

Я знаю, что вы можете код подсказки вручную внутри foreach, как...

foreach ($listOfLists as $fooList)
{
    foreach($fooList as $foo)
    {
        /** $var $foo Foo */
        // Code hinting, yay!!
    }
}

Или же...

foreach ($listOfLists as $fooList)
{
    /** $var $fooList Foo[] */
    foreach($fooList as $foo)
    {
        // Code hinting, yay!!
    }
}

Но я думаю, что это ужасно, так как $ listOfLists - это сборка массивов Foo, он должен знать, о чем я говорю, не напоминая об этом каждый раз, когда я реализую listOfLists.

Есть ли способ реализовать это?

1 ответ

Согласно сообщению об ошибке, связанному в комментариях @LazyOne, начиная с PhpStorm EAP 138.256 (таким образом, в PHPStorm 8) теперь поддерживается унифицированный многоуровневый анализ документов массива.

Это означает, что теперь вы можете сделать это:

/**
 * @var $listOfLists Foo[][]
 */
$listOfLists[] = (new FooList())->getFoos();
$listOfLists[] = (new FooList())->getFoos();
$listOfLists[] = (new FooList())->getFoos();
$listOfLists[] = (new FooList())->getFoos();

foreach ($listOfLists as $fooList)
{
    foreach($fooList as $foo)
    {
        // Code hinting, yay!!
        $foo->fooMethod();
    }
}

и получите ожидаемое:

Скриншот

Другие вопросы по тегам