Подсказка кода 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();
}
}
и получите ожидаемое: