460 Stimmen

PHPDoc type hinting für Array von Objekten?

In PHPDoc kann man also angeben @var über der Deklaration der Mitgliedsvariablen, um einen Hinweis auf ihren Typ zu geben. Dann weiß eine IDE, z.B.. PHPEd, wissen, mit welchem Objekttyp sie arbeiten und können einen Einblick in den Code dieser Variablen geben.

<?php
  class Test
  {
    /** @var SomeObj */
    private $someObjInstance;
  }
?>

Dies funktioniert gut, bis ich dasselbe mit einem Array von Objekten tun muss, um einen richtigen Hinweis zu erhalten, wenn ich später durch diese Objekte iteriere.

Gibt es also eine Möglichkeit, ein PHPDoc-Tag zu deklarieren, um anzugeben, dass die Mitgliedsvariable ein Array aus SomeObj s? @var Array ist nicht ausreichend, und @var array(SomeObj) scheint zum Beispiel nicht gültig zu sein.

943voto

Nishi Punkte 10325

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

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

El phpdoc-Dokumentation empfiehlt diese Methode:

die einen einzigen Typ enthalten, informiert die Typdefinition den Leser über den Typ jedes Arrayelements. Für ein bestimmtes Array wird dann nur ein Typ als Element erwartet.

Exemple : @return int[]

384voto

Zahymaka Punkte 6353

Verwendung:

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

bei der Typisierung von Inline-Variablen, und

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

für Klasseneigenschaften.

Frühere 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->
}

Ich mache das oft in Zend Studio. Ich weiß nicht, wie es bei anderen Editoren ist, aber es sollte funktionieren.

62voto

user1491819 Punkte 1760

Netbeans-Hinweise:

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

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

Sie können auch den Typ des Arrays in einer Liste von Klassenmitgliedern sehen, wenn Sie den Abschluss von $this->...

34voto

Gerard Roche Punkte 5319

PSR-5: PHPDoc schlägt eine Form der Notation im Stil der Generics 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> */

Anmerkung: Wenn Sie von einer IDE erwarten, dass sie Code-Assistenz bietet, dann ist es eine andere Frage, ob die IDE die PHPDoc Generic-style Collections Notation unterstützt.

Aus meiner Antwort an diese Frage .

32voto

Highmastdon Punkte 6501

Die Angabe einer Variablen ist 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 der Deklaration innerhalb der foreach ist nicht erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X