Preferisco leggere e scrivere codice pulito, come indicato in "Codice pulito" di Robert C. Martin. Quando segui il suo credo non devi richiedere allo sviluppatore (come utente della tua API) di conoscere la struttura (interna) del tuo array.
L'utente API può chiedere: è un array con una sola dimensione? Gli oggetti sono sparsi su tutti i livelli di un array multidimensionale? Di quanti loop nidificati (foreach, ecc.) Devo accedere a tutti gli oggetti? Che tipo di oggetti sono "memorizzati" in quell'array?
Come hai delineato, vuoi usare quell'array (che contiene oggetti) come un array monodimensionale.
Come indicato da Nishi è possibile utilizzare:
/**
* @return SomeObj[]
*/
per quello.
Ma ancora: attenzione: questa non è una notazione standard di blocco dei documenti. Questa notazione è stata introdotta da alcuni produttori IDE.
Ok, ok, come sviluppatore sai che "[]" è legato a un array in PHP. Ma cosa significa "qualcosa []" in un normale contesto PHP? "[]" significa: crea un nuovo elemento all'interno di "qualcosa". Il nuovo elemento potrebbe essere tutto. Ma quello che vuoi esprimere è: matrice di oggetti con lo stesso tipo ed è il tipo esatto. Come puoi vedere, il produttore IDE introduce un nuovo contesto. Un nuovo contesto che dovevi imparare. Un nuovo contesto che altri sviluppatori PHP hanno dovuto imparare (per capire i tuoi blocchi di documenti). Cattivo stile (!).
Poiché la tua matrice ha una dimensione, potresti voler chiamare quella "matrice di oggetti" un "elenco". Tenere presente che "elenco" ha un significato molto speciale in altri linguaggi di programmazione. Sarebbe molto meglio chiamarlo "raccolta" per esempio.
Ricorda: usi un linguaggio di programmazione che ti consente tutte le opzioni di OOP. Usa una classe invece di un array e rendi la tua classe percorribile come un array. Per esempio:
class orderCollection implements ArrayIterator
O se si desidera archiviare gli oggetti interni su livelli diversi all'interno di una struttura di matrice / oggetto multidimensionale:
class orderCollection implements RecursiveArrayIterator
Questa soluzione sostituisce l'array con un oggetto di tipo "orderCollection", ma finora non consente il completamento del codice all'interno dell'IDE. Va bene. Passo successivo:
Implementare i metodi introdotti dall'interfaccia con docblocks, in particolare:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Non dimenticare di utilizzare i suggerimenti sul tipo per:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Questa soluzione smette di introdurre molti:
/** @var $key ... */
/** @var $value ... */
in tutti i tuoi file di codice (ad es. all'interno di loop), come confermato da Zahymaka con la sua risposta. Il tuo utente API non è obbligato a introdurre quei blocchi di documenti, per avere il completamento del codice. Avere @return in un solo posto riduce la ridondanza (@var) il più possibile. Cospargere "docBlocks con @var" renderebbe il tuo codice peggiore leggibile.
Finalmente hai finito. Sembra difficile da raggiungere? Sembra di prendere un martello per rompere un dado? Non proprio, dal momento che hai familiarità con quelle interfacce e con il codice pulito. Ricorda: il tuo codice sorgente è scritto una volta / leggi molti.
Se il completamento del codice del tuo IDE non funziona con questo approccio, passa a uno migliore (ad esempio IntelliJ IDEA, PhpStorm, Netbeans) o invia una richiesta di funzione sul tracker del problema del tuo produttore IDE.
Grazie a Christian Weiss (dalla Germania) per essere stato il mio allenatore e per avermi insegnato cose fantastiche. PS: Incontriamoci con lui su XING.