Я предпочитаю читать и писать чистый код - как изложено в «Чистом коде» Роберта С. Мартина. Следуя его кредо, вы не должны требовать, чтобы разработчик (как пользователь вашего API) знал (внутреннюю) структуру вашего массива.
Пользователь API может спросить: это массив только с одним измерением? Распространены ли объекты на всех уровнях многомерного массива? Сколько вложенных циклов (foreach и т. Д.) Мне нужно для доступа ко всем объектам? Какие типы объектов «хранятся» в этом массиве?
Как вы обрисовали в общих чертах, вы хотите использовать этот массив (который содержит объекты) как одномерный массив.
Как указано Ниши, вы можете использовать:
/**
* @return SomeObj[]
*/
для этого.
Но опять же: имейте в виду - это не стандартное обозначение докблока. Это обозначение было введено некоторыми производителями IDE.
Хорошо, хорошо, как разработчик, вы знаете, что «[]» привязан к массиву в PHP. Но что означает «что-то []» в обычном контексте PHP? «[]» означает: создать новый элемент внутри «чего-то». Новый элемент может быть всем. Но то, что вы хотите выразить, это: массив объектов с одинаковым типом и точным типом. Как видите, производитель IDE вводит новый контекст. Новый контекст, который вы должны были изучить. Новый контекст, которому должны были научиться другие PHP-разработчики (чтобы понять ваши докблоки). Плохой стиль (!).
Поскольку у вашего массива есть одно измерение, вы можете назвать этот «массив объектов» списком. Имейте в виду, что «список» имеет особое значение в других языках программирования. Например, было бы лучше назвать это «коллекцией».
Помните: вы используете язык программирования, который дает вам все возможности ООП. Используйте класс вместо массива и сделайте свой класс проходимым как массив. Например:
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.