Я предпочитаю читать и писать чистый код - как описано в «Чистом коде» Роберта С. Мартина.
Следуя его кредо, вы не должны требовать от разработчика (как пользователя вашего API) знать (внутреннюю) структуру вашего массива.
Пользователь API может спросить: это массив только с одним измерением? Распространены ли объекты на всех уровнях многомерного массива? Сколько вложенных циклов (foreach и т. Д.) Мне нужно для доступа ко всем объектам? Какие типы объектов «хранятся» в этом массиве?
Как вы обрисовали, вы хотите использовать этот массив (который содержит объекты) как одномерный массив.
Как указано Ниши, вы можете использовать:
/**
* @return SomeObj[]
*/
за это.
Но опять же: имейте в виду - это не стандартная нотация докблока. Это обозначение было введено некоторыми производителями IDE.
Хорошо, хорошо, как разработчик, вы знаете, что «[]» привязан к массиву в PHP. Но что означает «что-то []» в обычном контексте PHP? «[]» означает: создать новый элемент внутри «чего-то». Новый элемент может быть всем. Но то, что вы хотите выразить, это: массив объектов с одинаковым типом и точным типом. Как видите, производитель IDE вводит новый контекст. Новый контекст, который вы должны были изучить. Новый контекст, которому должны были научиться другие PHP-разработчики (чтобы понять ваши докблоки). Плохой стиль (!).
Поскольку у вашего массива есть одно измерение, вы, возможно, захотите назвать этот «массив объектов» «списком». Имейте в виду, что «список» имеет особое значение в других языках программирования. Например, было бы лучше назвать это «коллекцией».
Помните: вы используете язык программирования, который предоставляет вам все возможности ООП.
Используйте класс вместо массива и сделайте свой класс проходимым как массив. E.g.:
class orderCollection implements ArrayIterator
Или, если вы хотите хранить внутренние объекты на разных уровнях в многомерной структуре массив / объект:
class orderCollection implements RecursiveArrayIterator
Это решение заменяет ваш массив объектом типа "orderCollection", но пока не включайте завершение кода в вашей IDE. Хорошо. Следующий шаг:
Реализация методов, представленных интерфейсом с помощью docblocks - в частности:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Не забудьте использовать тип подсказки для:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Это решение перестает вводить много:
/** @var $key ... */
/** @var $value ... */
во всех ваших кодовых файлах (например, внутри циклов), как Захымака подтвердила своим ответом. Ваш пользователь API не обязан вводить эти docblocks для завершения кода. Наличие @return только в одном месте уменьшает избыточность (@var) настолько, насколько это возможно. Прибавьте «docBlocks with @var», чтобы ваш код стал хуже читаемым.
Наконец, вы сделали. Выглядит трудно достичь? Похоже, взять кувалду, чтобы сломать орех? Не совсем, так как вы знакомы с этими интерфейсами и с чистым кодом. Помните: ваш исходный код написан один раз / прочитал много.
Если завершение кода в вашей среде IDE не работает с этим подходом, переключитесь на лучший (например, IntelliJ IDEA, PhpStorm, Netbeans) или отправьте запрос функции на средство отслеживания проблем вашего производителя IDE.
Спасибо Кристиану Вейссу (из Германии) за то, что он мой тренер и научил меня таким замечательным вещам. PS: Встретимся со мной на XING.