PhpStorm - Как правильно ввести ключ массива подсказок? - PullRequest
0 голосов
/ 05 ноября 2019

Все еще остается открытым вопрос о том, как аннотировать ключи массива с помощью PhpDoc: https://github.com/phpDocumentor/phpDocumentor2/issues/650

Я пробовал следующие обозначения:

/**
 * @return array<string, SomeClass>
 * @return SomeClass[string]
 */    
public function someMethod(): array { ... }

, но PhpStorm, кажется, не может решить эту проблемууместно, чтобы при использовании, например, foreach внутренний объект был неизвестен:

foreach($obj->someMethod() as $some) {
   $some->methodOfSomeClass(); // PhpStorm -> Method not found
}

Я знаю, что могу использовать оператор канала:

@return array<string, SomeClass>|SomeClass[]

Я также знаю, что могу печататьпеременные подсказки:

/** @var SomeClass $obj */
$obj

Но есть ли способ настроить PhpStorm для определения типа значения массива без использования канала?

1 Ответ

0 голосов
/ 05 ноября 2019

В PHP у вас либо числовые индексированные массивы, которые имеют целочисленные ключи, либо ассоциативные массивы со строковыми ключами. Из-за динамической типизации вы можете просто смешивать их и, следовательно, иметь оба типа.

Также в вашем примере вы используете не ключ, а значение, они намекаются на ClassName[].

/**
 * @return Class[]
 */
function getClasses(): array {
  return [new Class()];
}

С этим тиражом PHPStorm предоставит действительные всплывающие подсказки в циклах forEach. В противном случае вы можете использовать встроенный комментарий @type.

foreach ($objs as $obj) {
  /* @type Class $obj */
  $obj->someMethod(); //Is hinted
}
...