PHPDoc-Typ, der auf ein Array von Objekten hinweist?

417

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 SomeObjs ist? @varArray ist nicht genug und @var array(SomeObj)scheint zum Beispiel nicht gültig zu sein.

Artem Russakovskii
quelle
2
In diesem Netbeans 6.8- Entwicklungsblog
John Carter
3
@therefromhere: Ihr Link ist defekt. Ich denke, die neue URL lautet: blogs.oracle.com/netbeansphp/entry/php_templates_improved
DanielaWaranie
Für Leute wie mich, die vorbeikommen und nach einer Antwort suchen: Wenn Sie PHPStorm verwenden, schauen Sie sich die am häufigsten gewählte Antwort an: Sie hat einen bestimmten Hinweis! stackoverflow.com/a/1763425/1356098 (dies bedeutet nicht, dass es die Antwort für das OP sein sollte, da er zum Beispiel nach PHPEd fragt)
Erenor Paz

Antworten:

337

Verwenden:

/* @var $objs Test[] */
foreach ($objs as $obj) {
    // Typehinting will occur after typing $obj->
}

beim Eingeben von Inline-Variablen und

class A {
    /** @var Test[] */
    private $items;
}

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:

foreach ($Objs as $Obj)
{
    /* @var $Obj Test */
    // You should be able to get hinting after the preceding line if you type $Obj->
}

Das mache ich oft in Zend Studio. Ich weiß nichts über andere Editoren, aber es sollte funktionieren.

Zahymaka
quelle
3
Dies ist sinnvoll, hat aber bei PHPEd 5.2 nicht funktioniert. Das einzige, was ich mir einfallen lassen konnte, ist foreach ($ Objs als / ** @var Test * / $ Obj), was schrecklich hässlich ist. :(
Artem
14
Hinweis in Netbeans 7, scheint wichtig zu sein, dass Sie nur ein Sternchen haben - /** @var $Obj Test */funktioniert nicht.
Contrebis
3
@contrebis: Das "@var" ist ein gültiges Docblock-Tag. Selbst wenn Ihre IDE dies innerhalb eines Docblocks "/ ** ... /" nicht unterstützt und "@var" nur in "/ ... * /" unterstützt, ändern Sie bitte nicht Ihren korrekten Docblock. Melden Sie ein Problem beim Bug-Tracker Ihrer IDE, damit Ihre IDE den Standards entspricht. Stellen Sie sich vor, Ihr Entwicklungsteam / externe Entwickler / Community verwendet unterschiedliche IDEs. Behalte es wie es ist und sei auf die Zukunft vorbereitet.
DanielaWaranie
181
Stellen Sie sicher, dass Sie unten schauen! Ich habe fast nicht nach unten gescrollt - wäre ein großer Fehler gewesen !!! Viele IDEs unterstützen eine bessere Syntax! (Hinweis: @var Object[] $objectssagt, dass "$ Objekte" ein Array von Instanzen von Objekt ist.)
Thom Porter
10
/** @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.
srcspider
893

In der PhpStorm-IDE von JetBrains können Sie Folgendes verwenden /** @var SomeObj[] */: z.

/**
 * @return SomeObj[]
 */
function getSomeObjects() {...}

Die phpdoc-Dokumentation empfiehlt diese Methode:

Die Typdefinition enthält einen einzelnen Typ und informiert den Leser über den Typ jedes Array-Elements. Es wird dann nur ein Typ als Element für ein bestimmtes Array erwartet.

Beispiel: @return int[]

Nishi
quelle
10
Ich habe gerade heruntergeladen und benutze seit einer Woche phpstorm. Schlägt die Hölle aus Aptana heraus (was großartig ist, um frei zu sein). Genau das habe ich gesucht. Eigentlich ist es die gleiche Art und Weise, wie Sie es für JavaScript tun würden, hätte ich vermuten sollen
Juan Mendes
3
Danke, Mann! Genau das habe ich gesucht. PHPStorm ist fantastisch.
Erik Schierboom
5
Das funktioniert in Netbeans nicht, ich bin enttäuscht. Jetbrains machen einige sehr schöne Werkzeuge.
Keyo
10
@fishbone @Keyo Dies funktioniert jetzt in Netbeans (zumindest in 7.1 Nightly Build, vielleicht früher), obwohl Sie anscheinend eine temporäre Variable verwenden müssen (ein Fehler?). Andeutung für foreach(getSomeObjects() as $obj)funktioniert nicht, aber es funktioniert für$objs = getSomeObjects(); foreach($objs as $obj)
John Carter
2
Wäre schön @var Obj[string]für assoziative Arrays zu haben .
Donquijote
59

Netbeans Hinweise:

Sie erhalten Code - Vervollständigung auf $users[0]->und $this->für eine Reihe von Benutzerklassen.

/**
 * @var User[]
 */
var $users = array();

Sie können den Typ des Arrays auch in einer Liste der Klassenmitglieder sehen, wenn Sie den Vorgang abgeschlossen haben $this->...

user1491819
quelle
4
funktioniert auch in PhpStorm 9 EAP: / ** * @var UserInterface [] * / var $ users = []; // Array von Objekten, die eine Schnittstelle implementieren
Ronan
Ich habe es in NetBeans IDE 8.0.2 versucht, aber ich bekomme Vorschläge von der Klasse, in der ich mich gerade befinde.
Wojciech Jasiński
funktioniert auch in Eclipse 4.6.3 (idk welche Versionsunterstützung eingeführt wurde, aber es funktioniert und was ich jetzt benutze)
hanshenrik
Dies funktioniert leider 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.
William W
29

So geben Sie eine Variable an: ein Array von Objekten:

$needles = getAllNeedles();
/* @var $needles Needle[] */
$needles[1]->...                        //codehinting works

Dies funktioniert in Netbeans 7.2 (ich benutze es)

Funktioniert auch mit:

$needles = getAllNeedles();
/* @var $needles Needle[] */
foreach ($needles as $needle) {
    $needle->...                        //codehinting works
}

Daher ist die Verwendung einer Deklaration innerhalb der foreachnicht erforderlich.

Highmastdon
quelle
2
Diese Lösung ist meiner Ansicht nach sauberer als die akzeptierte Antwort, da Sie foreach mehrmals verwenden können und die Typhinweise /* @var $Obj Test */jedes Mal ohne neue Anmerkung funktionieren .
Henry
Ich sehe hier zwei Probleme: 1. Richtiges PHPDOC beginnt mit /** 2. Das richtige Format ist@var <data-type> <variable-name>
Christian
@Christian 1: Die Hauptfrage ist nicht phpdoc, sondern typehinting 2: Das richtige Format ist nicht so, wie Sie es sagen, auch nach anderen Antworten. In der Tat sehe ich 2 Probleme mit Ihrem Kommentar, und ich frage mich, warum Sie nicht Ihre eigene Antwort mit dem richtigen Format machen
Highmastdon
1. Typehinting funktioniert mit phpdoc ... Wenn Sie den Docblock nicht verwenden, versucht Ihre IDE nicht zu erraten, was Sie in einem zufälligen Kommentar geschrieben haben. 2. Das richtige Format ist, wie einige andere Antworten ebenfalls sagten, das, was ich oben angegeben habe; Datentyp vor Variablenname . 3. Ich habe keine weitere Antwort geschrieben, da die Frage keine weitere benötigt und ich lieber nicht nur Ihren Code bearbeiten möchte.
Christian
24

PSR-5: PHPDoc schlägt eine Form der Notation im Generics-Stil vor.

Syntax

Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>

Werte in einer Sammlung können sogar ein anderes Array und sogar eine andere Sammlung sein.

Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>

Beispiele

<?php

$x = [new Name()];
/* @var $x Name[] */

$y = new Collection([new Name()]);
/* @var $y Collection<Name> */

$a = new Collection(); 
$a[] = new Model_User(); 
$a->resetChanges(); 
$a[0]->name = "George"; 
$a->echoChanges();
/* @var $a Collection<Model_User> */

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 .

Gerard Roche
quelle
Die generische Notation wurde aus PSR-5 entfernt
zored
11

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.

DanielaWaranie
quelle
Das sieht nach dem "richtigen" Weg aus, aber ich kann es nicht dazu bringen, mit Netbeans zu arbeiten. Ein kleines Beispiel gemacht: imgur.com/fJ9Qsro
fehrlich
2
Vielleicht war dies 2012 "kein Standard", aber jetzt wird es als integrierte Funktionalität von phpDoc beschrieben.
Wirone
@Wirone es sieht so aus, als würde phpDocumentor dies als Reaktion auf die ide-Produzenten zu seinem Handbuch hinzufügen. Selbst wenn Sie über eine breite Tool-Unterstützung verfügen, bedeutet dies nicht, dass dies eine bewährte Methode ist. SomeObj [] verbreitet sich in immer mehr Projekten, ähnlich wie bei require, require_once, include und include_once vor Jahren. Mit dem automatischen Laden fällt das Erscheinungsbild dieser Anweisungen unter 5%. Hoffentlich fällt SomeObj [] innerhalb der nächsten 2 Jahre zugunsten des oben beschriebenen Ansatzes auf die gleiche Rate.
DanielaWaranie
1
Ich verstehe nicht warum? Dies ist eine sehr einfache und klare Notation. Wenn Sie sehen, dass SomeObj[]Sie wissen, dass es sich um eine zweidimensionale Anordnung von SomeObjInstanzen handelt, wissen Sie, was Sie damit tun sollen. Ich glaube nicht, dass es nicht dem Credo "Clean Code" folgt.
Wirone
Dies sollte die Antwort sein. Allerdings nicht alle IDE-Support-Ansätze mit @return <className>für current()und alle Jungs. PhpStorm unterstützt, also hat es mir sehr geholfen. Danke Kumpel!
Pavel
5

Verwendung array[type]in Zend Studio.

In Zend Studio, array[MyClass]oder array[int]oder sogar array[array[MyClass]]Arbeit groß.

Erick Robertson
quelle
5

In NetBeans 7.0 (möglicherweise auch niedriger) können Sie den Rückgabetyp "Array mit Textobjekten" genauso deklarieren, @return Textund der Code-Hinweis funktioniert:

Bearbeiten: Das Beispiel wurde mit dem Vorschlag von @Bob Fanger aktualisiert

/**
 * get all Tests
 *
 * @return Test|Array $tests
 */
public function getAllTexts(){
    return array(new Test(), new Test());
}

und benutze es einfach:

$tests =  $controller->getAllTests();
//$tests->         //codehinting works!
//$tests[0]->      //codehinting works!

foreach($tests as $text){
    //$test->      //codehinting works!
}

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.

d.raev
quelle
1
Ich verwende "@return array | Test Some description". Das löst das gleiche Verhalten aus, ist aber etwas erklärender.
Bob Fanger
1
Dies ist eine Problemumgehung , keine Lösung. Was Sie hier sagen, ist "diese Funktion kann ein Objekt vom Typ 'Test' ODER ein Array zurückgeben". Es sagt Ihnen jedoch technisch nichts darüber aus, was sich in dem Array befinden könnte.
Byson
5

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 MyEntitiesClassNamezu current()und der Rest der Iteratorund ArrayAccess-methoden , welche Rückgabewerte.

Boom! Keine Notwendigkeit in /** @var SomeObj[] $collectionObj */over foreachund 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:

class MyCollection implements Countable, Iterator, ArrayAccess {

    /**
     * @return User
     */
    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
}

Was für ein Nutzen wollte ich hinzufügen, um diese Antwort zu veröffentlichen

In meinem Fall current()und in anderen interfaceFällen sind AbstractMethoden 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 @methodzur Beschreibung einer bestimmten Auflistungsklasse.

Beispiel:

class User {

    function printLogin() {
        echo $this->login;
    }

}

abstract class MyCollection implements Countable, Iterator, ArrayAccess {

    protected $items = [];

    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
    //... abstract methods which will be shared among child-classes
}

/**
 * @method User current()
 * ...rest of methods (for ArrayAccess) if needed
 */
class UserCollection extends MyCollection {

    function add(User $user) {
        $this->items[] = $user;
    }

    // User collection specific methods...

}

Nun, Verwendung von Klassen:

$collection = new UserCollection();
$collection->add(new User(1));
$collection->add(new User(2));
$collection->add(new User(3));

foreach ($collection as $user) {
    // IDE should `recognize` method `printLogin()` here!
    $user->printLogin();
}

Noch einmal: Ich vermute, dass nicht alle IDE dies unterstützen, PhpStorm jedoch. Probieren Sie es aus, posten Sie die Ergebnisse im Kommentar!

Pavel
quelle
Gutschein dafür, dass ich es so weit gebracht habe, aber leider kann ich mich immer noch dazu entschließen, eine Sammlung zu spezialisieren, um gute alte Java-Generika zu ersetzen .... yuck '
Sebas
Vielen Dank. Wie können Sie eine statische Methode eingeben?
Jewgenij Afanasjew
3

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:

class MyObj
{
    private $val;
    public function __construct($val) { $this->val = $val; }
    public function getter() { return $this->val; }
}

/**
 * @method MyObj current()
 */
class MyObjCollection extends ArrayIterator
{
    public function __construct(Array $array = [])
    {
        foreach($array as $object)
        {
            if(!is_a($object, MyObj::class))
            {
                throw new Exception('Invalid object passed to ' . __METHOD__ . ', expected type ' . MyObj::class);
            }
        }
        parent::__construct($array);
    }

    public function echoContents()
    {
        foreach($this as $key => $myObj)
        {
            echo $key . ': ' . $myObj->getter() . '<br>';
        }
    }
}

$myObjCollection = new MyObjCollection([
    new MyObj(1),
    new MyObj('foo'),
    new MyObj('blah'),
    new MyObj(23),
    new MyObj(array())
]);

$myObjCollection->echoContents();

Der Schlüssel hier ist das PHPDoc, @method MyObj current()das den von ArrayIterator (dh mixed) geerbten Rückgabetyp überschreibt . Die Aufnahme dieses PHPDoc bedeutet, dass wir beim Durchlaufen der Klasseneigenschaften mit foreach($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:

  • Fügen Sie nach Bedarf andere PHPDocs auf Klassenebene für Methoden wie offsetGet($index)und hinzunext()
  • Verschieben Sie die Überprüfung der Integrität is_a($object, MyObj::class)vom Konstruktor in eine private Methode
  • Nennen Sie diese (jetzt private) Überprüfung der Integrität anhand von Methodenüberschreibungen wie offsetSet($index, $newval)undappend($value)
e_i_pi
quelle
Sehr schöne und saubere Lösung! :)
Marko Šutija
2

Das Problem ist, dass @varnur 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.

troelskn
quelle
5
Eines der Dinge, die ich an C / C ++ liebe, ist, dass es tatsächlich Typen bis zu diesem Level verfolgt. Das wäre ein sehr angenehmer Hang zum Abrutschen.
Brilliand
2
Wird von Netbeans 7.2 unterstützt (zumindest ist das die Version, die ich verwende), aber mit einer kleinen Anpassung, nämlich : /* @var $foo Foo[] */. Habe gerade eine Antwort darüber geschrieben. Dies kann auch innerhalb von foreach(){}Schleifen verwendet werden
Highmastdon
1
<?php foreach($this->models as /** @var Model_Object_WheelModel */ $model): ?>
    <?php
    // Type hinting now works:
    $model->getImage();
    ?>
<?php endforeach; ?>
Scott Hovestadt
quelle
5
Welche IDEs unterstützen dies?
Philfreo
21
Das ist sehr hässlich. Verabschieden Sie sich vom Bereinigen des Codes, wenn Sie mit der Programmierung beginnen.
halfpastfour.am
Schauen Sie sich lieber meine Antwort mit der Definition des Inhalts des Arrays an: stackoverflow.com/a/14110784/431967
Highmastdon
-5

Ich habe etwas gefunden, das funktioniert, es kann Leben retten!

private $userList = array();
$userList = User::fetchAll(); // now $userList is an array of User objects
foreach ($userList as $user) {
   $user instanceof User;
   echo $user->getName();
}
Eupho
quelle
11
Das einzige Problem ist, dass zusätzlicher Code ausgeführt wird, der nur von Ihrer IDE verwendet wird. Es ist viel besser, stattdessen Typhinweise in den Kommentaren zu definieren.
Ben Rowe
1
Wow das funktioniert super. Sie würden mit zusätzlichem Code enden, aber es scheint harmlos zu sein. Ich werde anfangen: $ x Instanz von Y; // typehint
Igor Nadj
3
Wechseln Sie zu einer IDE, mit der Sie den Code basierend auf Dokumentenblöcken oder Inspektionen vervollständigen können. Wenn Sie Ihre IDE-Datei nicht wechseln möchten, stellen Sie eine Funktionsanforderung im Issue-Tracker Ihrer IDE.
DanielaWaranie
1
Wenn dies eine Ausnahme auslöst, wenn der Typ nicht korrekt ist, kann dies für die Überprüfung des Laufzeit-Typs hilfreich sein. If ...
Lilbyrdie