Подтвердить что ты не робот

PHPDoc: Typehint во вложенных массивах (например, с 2 измерениями)

Есть ли правильный способ документировать значения/объекты в массивах, которые находятся в другом измерении?

Обычно массив обрабатывается следующим образом:

/** @var ClassName[] $Array */
$Array = array( $InstanceOfClassName,.. )

Но мне нужно что-то вроде этого:

/** @var ClassName[][] $Array */
$Array = array( 0 => array( $InstanceOfClassName,.. ) )

Это, очевидно, не работает, поэтому какова правильная нотация PHPDoc?

4b9b3361

Ответ 1

Во-первых, поймите, что это использование @var не является стандартной спецификацией phpDocumentor. Это один из нескольких способов, с помощью которых различные IDE пытались сделать "автозаполнение для локальных переменных" возможным. Я знаю, что Eclipse использует формат /* @var $varName \ClassName */. Поэтому имейте это в виду, когда появятся другие ответы/предложения.

Единственный способ, с помощью которого я могу использовать этот взлом для автозаполнения IDE с вашим двумерным массивом, - это использовать другой @var позже, когда вы читаете первое измерение, но это требует, чтобы перейти к самой переменной:

/* @var $outer array */
$outer = array( 0 => array($InstanceOfClassName,...));

/* @var $inner ClassName[] */
$inner = $outer[0];

$inner[0]-> (предположим, что здесь автозаполнение методов ClassName)

Теперь опять же, насколько это полезно для автозаполнения, зависит от того, как построила его IDE. Некоторые IDE могут знать этот синтаксис ClassName [] и вывести, что элемент, извлеченный из $inner, является ClassName, и поэтому он может показывать свои методы. Тем не менее, я не могу сказать, что я видел, что IDE делает это еще. В лучшем случае, чтобы увидеть, что IDE просто имеют доступ к хакерству @var в самой базовой форме (/* @var $var ClassName */).

TL; DR: Ваш пробег может варьироваться, только пытаясь получить половину того, что вы после: -)

Ответ 2

PhpStorm позволяет вводить вложенные массивы с двойными скобками [] []:

/** @var \SplFileInfo[][] $doubleNestedArray */
$doubleNestedArray = [[]];

$doubleNestedArray[0][1]->getFileInfo(); // ->getFileInfo() is suggested by IDE