Prefiero leer y escribir código limpio, como se describe en "Código limpio" de Robert C. Martin. Al seguir su credo, no debe exigir al desarrollador (como usuario de su API) que conozca la estructura (interna) de su matriz.
El usuario de la API puede preguntar: ¿Es eso una matriz con una sola dimensión? ¿Se extienden los objetos en todos los niveles de una matriz multidimensional? ¿Cuántos bucles anidados (foreach, etc.) necesito para acceder a todos los objetos? ¿Qué tipo de objetos están "almacenados" en esa matriz?
Como describió, desea usar esa matriz (que contiene objetos) como una matriz unidimensional.
Como lo describe Nishi, puede usar:
/**
* @return SomeObj[]
*/
para eso.
Pero de nuevo: tenga en cuenta que esta no es una notación estándar de docblock. Esta notación fue introducida por algunos productores de IDE.
Ok, ok, como desarrollador sabes que "[]" está vinculado a una matriz en PHP. Pero, ¿qué significa "algo []" en el contexto normal de PHP? "[]" significa: crear un nuevo elemento dentro de "algo". El nuevo elemento podría ser todo. Pero lo que quiere expresar es: una matriz de objetos con el mismo tipo y su tipo exacto. Como puede ver, el productor de IDE presenta un nuevo contexto. Un nuevo contexto que tenías que aprender. Un nuevo contexto que otros desarrolladores de PHP tuvieron que aprender (para comprender sus bloques de documentos). Mal estilo (!).
Debido a que su matriz tiene una dimensión, tal vez quiera llamar a esa "matriz de objetos" una "lista". Tenga en cuenta que "lista" tiene un significado muy especial en otros lenguajes de programación. Sería mejor llamarlo "colección", por ejemplo.
Recuerde: utiliza un lenguaje de programación que le permite todas las opciones de OOP. Use una clase en lugar de una matriz y haga que su clase sea transitable como una matriz. P.ej:
class orderCollection implements ArrayIterator
O si desea almacenar los objetos internos en diferentes niveles dentro de una estructura de objeto / matriz multidimensional:
class orderCollection implements RecursiveArrayIterator
Esta solución reemplaza su matriz por un objeto de tipo "orderCollection", pero hasta ahora no habilita la finalización de código dentro de su IDE. Bueno. Próximo paso:
Implemente los métodos introducidos por la interfaz con docblocks, en particular:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
No olvide usar sugerencias de tipo para:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Esta solución deja de introducir muchos:
/** @var $key ... */
/** @var $value ... */
en todos sus archivos de código (por ejemplo, dentro de bucles), como lo confirmó Zahymaka con su respuesta. Su usuario de API no está obligado a introducir ese bloque de documentos para completar el código. Tener @return en un solo lugar reduce la redundancia (@var) lo más posible. Espolvoree "docBlocks con @var" haría que su código sea peor legible.
Finalmente has terminado. ¿Parece difícil de lograr? Parece que tomar un mazo para romper una nuez? No realmente, ya que está familiarizado con esas interfaces y con el código limpio. Recuerde: su código fuente se escribe una vez / lee muchos.
Si la finalización del código de su IDE no funciona con este enfoque, cambie a uno mejor (por ejemplo, IntelliJ IDEA, PhpStorm, Netbeans) o presente una solicitud de función en el rastreador de problemas de su productor de IDE.
Gracias a Christian Weiss (de Alemania) por ser mi entrenador y por enseñarme cosas tan maravillosas. PD: Encuéntrate conmigo y con él en XING.