Ich ziehe es vor, sauberen Code zu lesen und zu schreiben - wie in "Clean Code" von Robert C. Martin beschrieben. Wenn Sie seinem Credo folgen, sollten Sie nicht verlangen, dass der Entwickler (als Benutzer Ihrer API) die (interne) Struktur Ihres Arrays kennt.
Der API-Benutzer könnte sich fragen: Ist das ein Array mit nur einer Dimension? Sind die Objekte auf allen Ebenen eines mehrdimensionalen Arrays verteilt? Wie viele verschachtelte Schleifen (foreach usw.) brauche ich, um auf alle Objekte zuzugreifen? Welche Art von Objekten wird in diesem Array "gespeichert"?
Wie Sie dargelegt haben, möchten Sie dieses Array (das Objekte enthält) als eindimensionales Array verwenden.
Wie von Nishi skizziert, können Sie verwenden:
/**
* @return SomeObj[]
*/
dafür.
Aber noch einmal: Seien Sie sich bewusst, dass dies keine Standard-Docblock-Notation ist. Diese Notation wurde von einigen IDE-Herstellern eingeführt.
Okay, okay, als Entwickler wissen Sie, dass "[]" in PHP an ein Array gebunden ist. Aber was bedeutet "irgendwas[]" im normalen PHP-Kontext? "[]" bedeutet: ein neues Element innerhalb von "irgendwas" erstellen. Das neue Element könnte alles sein. Was Sie aber ausdrücken wollen, ist: Array von Objekten mit demselben Typ und seinem genauen Typ. Wie Sie sehen können, führt der IDE-Produzent einen neuen Kontext ein. Einen neuen Kontext, den Sie lernen müssen. Einen neuen Kontext, den andere PHP-Entwickler lernen mussten (um Ihre Docblocks zu verstehen). Schlechter Stil (!).
Da Ihr Array eine Dimension hat, möchten Sie dieses "Array von Objekten" vielleicht als "Liste" bezeichnen. Seien Sie sich bewusst, dass "Liste" in anderen Programmiersprachen eine sehr spezielle Bedeutung hat. Es wäre zum Beispiel viel besser, es "Sammlung" zu nennen.
Denken Sie daran: Sie verwenden eine Programmiersprache, die Ihnen alle Möglichkeiten der OOP bietet. Verwenden Sie eine Klasse anstelle eines Arrays und machen Sie Ihre Klasse wie ein Array durchsuchbar. Z.B.:
class orderCollection implements ArrayIterator
Oder wenn Sie die internen Objekte auf verschiedenen Ebenen innerhalb einer mehrdimensionalen Array-/Objektstruktur speichern möchten:
class orderCollection implements RecursiveArrayIterator
Diese Lösung ersetzt Ihr Array durch ein Objekt vom Typ "orderCollection", aber aktivieren Sie die Code-Vervollständigung in Ihrer IDE noch nicht. Nun gut. Nächster Schritt:
Implementieren Sie die Methoden, die durch die Schnittstelle mit Docblocks eingeführt werden - insbesondere:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Vergessen Sie nicht, Type Hinting für zu verwenden:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Diese Lösung verhindert die Einführung einer Menge von:
/** @var $key ... */
/** @var $value ... */
überall in Ihren Codedateien (z. B. in Schleifen), wie Zahymaka in ihrer Antwort bestätigt hat. Ihr API-Benutzer ist nicht gezwungen, diese docblocks einzuführen, um Code-Vervollständigung zu haben. Mit @return an nur einer Stelle wird die Redundanz (@var) so weit wie möglich reduziert. Das Einstreuen von "docBlocks mit @var" würde Ihren Code schlecht lesbar machen.
Endlich sind Sie fertig. Sieht schwer zu erreichen aus? Sieht es so aus, als würde man mit einem Vorschlaghammer eine Nuss knacken? Nicht wirklich, denn Sie sind mit diesen Schnittstellen und sauberem Code vertraut. Denken Sie daran: Ihr Quellcode wird einmal geschrieben/viel gelesen.
Wenn die Code-Vervollständigung Ihrer IDE mit diesem Ansatz nicht funktioniert, wechseln Sie zu einer besseren IDE (z.B. IntelliJ IDEA, PhpStorm, Netbeans) oder stellen Sie einen Feature-Request im Issue-Tracker Ihres IDE-Herstellers.
Danke an Christian Weiss (aus Deutschland), dass er mein Trainer war und mir so tolle Sachen beigebracht hat. PS: Triff mich und ihn auf XING.