In PHPDoc kann man also @var
über der Deklaration der Mitgliedsvariablen angeben, um auf ihren Typ hinzuweisen. Dann eine IDE, zum Beispiel. PHPEd weiß, mit welcher Art von Objekt es arbeitet, und kann einen Code-Einblick für diese Variable geben.
<?php
class Test
{
/** @var SomeObj */
private $someObjInstance;
}
?>
Dies funktioniert so lange, bis ich dasselbe mit einem Array von Objekten tun muss, um einen richtigen Hinweis zu erhalten, wenn ich diese Objekte später durchlaufe.
Gibt es also eine Möglichkeit, ein PHPDoc-Tag zu deklarieren, um anzugeben, dass die Mitgliedsvariable ein Array von SomeObj
s ist? @var
Array ist nicht genug und @var array(SomeObj)
scheint zum Beispiel nicht gültig zu sein.
Antworten:
Verwenden:
beim Eingeben von Inline-Variablen und
für Klasseneigenschaften.
Vorherige Antwort von '09, als PHPDoc (und IDEs wie Zend Studio und Netbeans) diese Option nicht hatten:
Das Beste, was Sie tun können, ist zu sagen:
Das mache ich oft in Zend Studio. Ich weiß nichts über andere Editoren, aber es sollte funktionieren.
quelle
/** @var $Obj Test */
funktioniert nicht.@var Object[] $objects
sagt, dass "$ Objekte" ein Array von Instanzen von Objekt ist.)/** @var TYPE $variable_name */
ist die richtige Syntax; Kehren Sie nicht die Reihenfolge von Typ und Variablenname um (wie weiter oben in den Kommentaren vorgeschlagen), da dies nicht in allen Fällen funktioniert.In der PhpStorm-IDE von JetBrains können Sie Folgendes verwenden
/** @var SomeObj[] */
: z.Die phpdoc-Dokumentation empfiehlt diese Methode:
quelle
foreach(getSomeObjects() as $obj)
funktioniert nicht, aber es funktioniert für$objs = getSomeObjects(); foreach($objs as $obj)
@var Obj[string]
für assoziative Arrays zu haben .Netbeans Hinweise:
Sie erhalten Code - Vervollständigung auf
$users[0]->
und$this->
für eine Reihe von Benutzerklassen.Sie können den Typ des Arrays auch in einer Liste der Klassenmitglieder sehen, wenn Sie den Vorgang abgeschlossen haben
$this->...
quelle
array_pop()
aus irgendeinem Grund nicht nach der Verwendung oder ähnlichen Funktionen. Netbeans erkennt anscheinend nicht, dass diese Funktionen ein einzelnes Element des Eingabearrays zurückgeben.So geben Sie eine Variable an: ein Array von Objekten:
Dies funktioniert in Netbeans 7.2 (ich benutze es)
Funktioniert auch mit:
Daher ist die Verwendung einer Deklaration innerhalb der
foreach
nicht erforderlich.quelle
/* @var $Obj Test */
jedes Mal ohne neue Anmerkung funktionieren ./**
2. Das richtige Format ist@var <data-type> <variable-name>
PSR-5: PHPDoc schlägt eine Form der Notation im Generics-Stil vor.
Syntax
Werte in einer Sammlung können sogar ein anderes Array und sogar eine andere Sammlung sein.
Beispiele
Hinweis: Wenn Sie erwarten, dass eine IDE Codeunterstützung ausführt, ist es eine weitere Frage, ob die IDE die Notation von Sammlungen im generischen PHPDoc-Stil unterstützt.
Von meiner Antwort auf diese Frage .
quelle
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:
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:
Oder wenn Sie die internen Objekte auf verschiedenen Ebenen in einer mehrdimensionalen Array- / Objektstruktur speichern möchten:
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:
Vergessen Sie nicht, Typhinweise zu verwenden für:
Diese Lösung führt nicht mehr viele ein:
Ü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.
quelle
SomeObj[]
Sie wissen, dass es sich um eine zweidimensionale Anordnung vonSomeObj
Instanzen handelt, wissen Sie, was Sie damit tun sollen. Ich glaube nicht, dass es nicht dem Credo "Clean Code" folgt.@return <className>
fürcurrent()
und alle Jungs. PhpStorm unterstützt, also hat es mir sehr geholfen. Danke Kumpel!Verwendung
array[type]
in Zend Studio.In Zend Studio,
array[MyClass]
oderarray[int]
oder sogararray[array[MyClass]]
Arbeit groß.quelle
In NetBeans 7.0 (möglicherweise auch niedriger) können Sie den Rückgabetyp "Array mit Textobjekten" genauso deklarieren,
@return Text
und der Code-Hinweis funktioniert:Bearbeiten: Das Beispiel wurde mit dem Vorschlag von @Bob Fanger aktualisiert
und benutze es einfach:
Es ist nicht perfekt, aber es ist besser, es einfach "gemischt" zu lassen, was keinen Wert bringt.
CONS ist, dass Sie das Array als Textobjekt betreten dürfen, das Fehler auslöst.
quelle
Wie DanielaWaranie in ihrer Antwort erwähnt - gibt es einen Weg , um die Art von $ item angeben , wenn Sie $ Artikel in $ collectionObject iterieren: In
@return MyEntitiesClassName
zucurrent()
und der Rest derIterator
undArrayAccess
-methoden , welche Rückgabewerte.Boom! Keine Notwendigkeit in
/** @var SomeObj[] $collectionObj */
overforeach
und funktioniert direkt mit dem Auflistungsobjekt, keine Notwendigkeit, die Auflistung mit der spezifischen Methode zurückzugeben, die als beschrieben wird@return SomeObj[]
.Ich vermute, dass nicht alle IDE es unterstützen, aber es funktioniert einwandfrei in PhpStorm, was mich glücklicher macht.
Beispiel:
Was für ein Nutzen wollte ich hinzufügen, um diese Antwort zu veröffentlichen
In meinem Fall
current()
und in andereninterface
Fällen sindAbstract
Methoden in der Klasse -collection implementiert, und ich weiß nicht, welche Art von Entitäten eventuell in der Sammlung gespeichert werden.Hier ist also der Trick: Geben Sie keinen Rückgabetyp in der abstrakten Klasse an, sondern verwenden Sie stattdessen die PhpDoc-Anweisung
@method
zur Beschreibung einer bestimmten Auflistungsklasse.Beispiel:
Nun, Verwendung von Klassen:
Noch einmal: Ich vermute, dass nicht alle IDE dies unterstützen, PhpStorm jedoch. Probieren Sie es aus, posten Sie die Ergebnisse im Kommentar!
quelle
Ich weiß, dass ich zu spät zur Party komme, aber ich habe kürzlich an diesem Problem gearbeitet. Ich hoffe, jemand sieht das, denn die akzeptierte Antwort ist zwar richtig, aber nicht der beste Weg, dies zu tun. Zumindest nicht in PHPStorm, aber ich habe NetBeans noch nicht getestet.
Am besten erweitern Sie die ArrayIterator-Klasse, anstatt native Array-Typen zu verwenden. Auf diese Weise können Sie Hinweise auf Klassenebene und nicht auf Instanzebene eingeben. Dies bedeutet, dass Sie nur einmal PHPDoc ausführen müssen, nicht im gesamten Code (was nicht nur chaotisch ist und gegen DRY verstößt, sondern auch problematisch sein kann, wenn es darum geht Refactoring - PHPStorm hat die Angewohnheit, beim Refactoring PHPDoc zu vermissen.)
Siehe Code unten:
Der Schlüssel hier ist das PHPDoc,
@method MyObj current()
das den von ArrayIterator (dhmixed
) geerbten Rückgabetyp überschreibt . Die Aufnahme dieses PHPDoc bedeutet, dass wir beim Durchlaufen der Klasseneigenschaften mitforeach($this as $myObj)
die Code-Vervollständigung erhalten, wenn wir auf die Variable verweisen$myObj->...
Für mich ist dies der beste Weg, dies zu erreichen (zumindest bis PHP typisierte Arrays einführt, falls dies jemals der Fall sein sollte), da wir den Iteratortyp in der iterierbaren Klasse deklarieren, nicht in Instanzen der im Code verteilten Klasse.
Ich habe hier nicht die vollständige Lösung für die Erweiterung von ArrayIterator gezeigt. Wenn Sie diese Technik verwenden, möchten Sie möglicherweise auch:
offsetGet($index)
und hinzunext()
is_a($object, MyObj::class)
vom Konstruktor in eine private MethodeoffsetSet($index, $newval)
undappend($value)
quelle
Das Problem ist, dass
@var
nur ein einzelner Typ bezeichnet werden kann - keine komplexe Formel enthalten. Wenn Sie eine Syntax für "Array of Foo" hatten, warum sollten Sie dort anhalten und keine Syntax für "Array of Array, das 2 Foo's und drei Bar's enthält" hinzufügen? Ich verstehe, dass eine Liste von Elementen vielleicht allgemeiner ist, aber es ist ein rutschiger Hang.Persönlich habe ich einige Male verwendet
@var Foo[]
, um "ein Array von Foo's" zu bezeichnen, aber es wird von IDEs nicht unterstützt.quelle
/* @var $foo Foo[] */
. Habe gerade eine Antwort darüber geschrieben. Dies kann auch innerhalb vonforeach(){}
Schleifen verwendet werdenquelle
Ich habe etwas gefunden, das funktioniert, es kann Leben retten!
quelle