Я вважаю за краще читати і писати чистий код - як викладено в «Чистому коді» Роберта К. Мартіна. Дотримуючись його кредо, ви не повинні вимагати від розробника (як користувача вашого API) знати (внутрішню) структуру вашого масиву.
Користувач API може запитати: це масив лише одного виміру? Чи об'єкти розміщені навколо всіх рівнів багатовимірного масиву? Скільки вкладених циклів (foreach тощо) мені потрібно для доступу до всіх об’єктів? Який тип об’єктів "зберігається" в цьому масиві?
Як ви окреслили, ви хочете використовувати цей масив (який містить об'єкти) як одномірний масив.
Як зазначає Ніші, ви можете використовувати:
/**
* @return SomeObj[]
*/
для того.
Але ще раз: будьте в курсі - це не стандартне позначення docblock. Це позначення було введено деякими виробниками IDE.
Гаразд, добре, як розробник ви знаєте, що "[]" прив'язаний до масиву в PHP. Але що означає "щось []" у звичайному контексті PHP? "[]" означає: створити новий елемент у межах "чогось". Новим елементом може бути все. Але те, що ви хочете висловити, це: масив об'єктів одного типу і його точний тип. Як бачите, виробник IDE вводить новий контекст. Новий контекст, який ти повинен був вивчити. Новий контекст, який повинні були вивчити інші розробники PHP (щоб зрозуміти ваші docblocks). Поганий стиль (!).
Оскільки ваш масив має один вимір, ви, можливо, хочете назвати цей "масив об'єктів" "списком". Майте на увазі, що "список" має дуже особливе значення в інших мовах програмування. Краще було б, наприклад, назвати це "колекцією".
Пам'ятайте: ви використовуєте мову програмування, яка дозволяє вам використовувати всі варіанти OOP. Використовуйте клас замість масиву та зробіть його клас прохідним, як масив. Наприклад:
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 з @var" зробить ваш код найгіршим для читання.
Зрештою, ви все зробили. Виглядає важко за добу? Схоже, взяти кувалду, щоб зламати горіх? Не справді, оскільки ви знайомі з цим інтерфейсом та чистим кодом. Пам'ятайте: ваш вихідний код пишеться один раз / читають багато.
Якщо завершення коду вашої IDE не працює при такому підході, перейдіть на кращий (наприклад, IntelliJ IDEA, PhpStorm, Netbeans) або подайте запит на функцію у трекер випуску виробника IDE.
Дякую Крістіану Вайсу (з Німеччини) за те, що він був моїм тренером і за те, що навчав мене такої чудової речі. PS: Знайомтесь зі мною та ним на XING.