2013-12-17 2 views
8

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

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 является массивом Фоос, и поэтому знает тип, что $ 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 ($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.

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

+3

http://youtrack.jetbrains.com/issue/WI-12303 – LazyOne

+0

Благодаря LazyOne ! Я уже поддержал эту проблему. Если вы ответите на это сообщение с ответом, в котором объясняется, что эта проблема на самом деле является запрошенной функцией, я соглашусь с ней. –

+3

Этот вопрос не соответствует теме, потому что речь идет о запросе функции в стороннем приложении. –

ответ

8

В соответствии с bug report, связанным в comments by @LazyOne, начиная с PhpStorm EAP 138.256 (таким образом, в PHPStorm 8) поддерживается равномерный многоуровневый синтаксический анализ doc.

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

/** 
* @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(); 
    } 
} 

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

Screenshot

Смежные вопросы