Ich lese und schreibe lieber sauberen Code - 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 kann 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.) benötige ich, um auf alle Objekte zuzugreifen? Welche Art von Objekten wird in diesem Array "gespeichert"?
Wie Sie beschrieben haben, möchten Sie dieses Array (das Objekte enthält) als eindimensionales Array verwenden.
Wie von Nishi beschrieben, können Sie Folgendes verwenden:
/**
* @return SomeObj[]
*/
dafür.
Aber noch einmal: Seien Sie sich bewusst - dies ist keine Standard-Docblock-Notation. Diese Notation wurde von einigen IDE-Herstellern eingeführt.
Okay, okay, als Entwickler wissen Sie, dass "[]" an ein Array in PHP gebunden ist. Aber was bedeutet ein "etwas []" im normalen PHP-Kontext? "[]" bedeutet: Neues Element in "etwas" erstellen. Das neue Element könnte alles sein. Was Sie jedoch ausdrücken möchten, ist: Array von Objekten mit demselben Typ und genauem Typ. Wie Sie sehen können, führt der IDE-Produzent einen neuen Kontext ein. Ein neuer Kontext, den man lernen musste. Ein neuer 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" möglicherweise als "Liste" bezeichnen. Beachten Sie, dass "Liste" in anderen Programmiersprachen eine ganz besondere Bedeutung hat. Es wäre besser, es zum Beispiel "Sammlung" zu nennen.
Denken Sie daran: Sie verwenden eine Programmiersprache, die Ihnen alle Optionen von OOP ermöglicht. Verwenden Sie eine Klasse anstelle eines Arrays und machen Sie Ihre Klasse wie ein Array durchlaufbar. Z.B:
class orderCollection implements ArrayIterator
Oder wenn Sie die internen Objekte auf verschiedenen Ebenen in einer mehrdimensionalen Array- / Objektstruktur speichern möchten:
class orderCollection implements RecursiveArrayIterator
Diese Lösung ersetzt Ihr Array durch ein Objekt vom Typ "orderCollection", aktiviert jedoch noch nicht die Code-Vervollständigung in Ihrer IDE. Okay. Nächster Schritt:
Implementieren Sie die Methoden, die von der 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, Typhinweise zu verwenden für:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Diese Lösung führt nicht mehr viele ein:
/** @var $key ... */
/** @var $value ... */
Überall in Ihren Codedateien (z. B. innerhalb von Schleifen), wie Zahymaka mit seiner Antwort bestätigt hat. Ihr API-Benutzer ist nicht gezwungen, diese Dokumentblöcke einzuführen, um den Code zu vervollständigen. Wenn Sie @return nur an einer Stelle haben, wird die Redundanz (@var) so weit wie möglich reduziert. Wenn Sie "docBlocks with @var" streuen, ist Ihr Code am schlechtesten lesbar.
Endlich bist du fertig. Sieht schwer zu erreichen aus? Sieht aus wie ein Vorschlaghammer, um eine Nuss zu knacken? Nicht wirklich, da Sie mit diesen Schnittstellen und mit sauberem Code vertraut sind. Denken Sie daran: Ihr Quellcode wird einmal geschrieben / viele gelesen.
Wenn die Code-Vervollständigung Ihrer IDE mit diesem Ansatz nicht funktioniert, wechseln Sie zu einem besseren (z. B. IntelliJ IDEA, PhpStorm, Netbeans) oder reichen Sie eine Funktionsanforderung im Issue-Tracker Ihres IDE-Herstellers ein.
Vielen Dank an Christian Weiss (aus Deutschland), der mein Trainer war und mir so tolle Sachen beigebracht hat. PS: Triff mich und ihn auf XING.