431 votes

PHPDoc type hinting pour tableau d’objets ?

Ainsi, dans PHPDoc on peut spécifier @var au-dessus de la variable de membre de déclaration de soupçon à son type. Puis un IDE, pour ex. PHPEd, va savoir quel type d'objet, c'est de travailler avec et sera en mesure de fournir un aperçu de code pour cette variable.

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

Cela fonctionne très bien jusqu'à ce que j'ai besoin de faire la même chose pour un tableau d'objets pour être en mesure d'obtenir un bon conseil lorsque je l'itération à travers ces objets plus tard.

Alors, est-il une façon de déclarer un PHPDoc balise pour indiquer que le membre de la variable est un tableau d' SomeObjs? @var tableau n'est pas assez, et @var array(SomeObj) ne semble pas être valide, par exemple.

902voto

Nishi Points 3515

Dans l’IDE de PhpStorm de JetBrains, vous pouvez utiliser `` , par exemple :

La documentation de phpdoc recommande cette méthode :

spécifié contenant un seul type, la définition de Type informe le lecteur du type de chaque élément du tableau. Qu’un seul Type devrait ensuite comme élément d’un tableau donné.

Exemple :``

371voto

Zahymaka Points 2589

Le mieux que vous pouvez faire est de dire :

J’ai faire beaucoup dans Zend Studio. Ne pas connaître d’autres éditeurs, mais il devrait fonctionner.

32voto

Highmastdon Points 1966

Pour spécifier une variable est un tableau d’objets :

Cela fonctionne dans Netbeans 7.2 (je l’utilise)

Fonctionne également avec :

Donc l’utilisation de la déclaration à l’intérieur de la `` n’est pas nécessaire.

11voto

DanielaWaranie Points 850

Je préfère lire et écrire du code propre, comme il est précisé dans le "Code Propre" par Robert C. Martin. Quand à la suite de son credo, vous ne devriez pas exiger que le promoteur (en tant qu'utilisateur de votre API) pour connaître le (internes) de la structure de votre tableau.

L'API utilisateur peut demander: Est-ce qu'un tableau à une seule dimension? Sont les objets de propagation de tous les niveaux d'un tableau multi dimensionnel? Combien de boucles imbriquées (foreach, etc.) ai-je besoin pour accéder à tous les objets? Quels types d'objets sont "stockés" dans ce tableau?

Comme vous l'avez indiqué que vous souhaitez utiliser ce tableau (qui contient des objets) comme un tableau unidimensionnel.

Comme indiqué par Nishi vous pouvez utiliser:

/**
 * @return SomeObj[]
 */

pour cela.

Mais encore une fois: ce n'est pas une norme docblock notation. Cette notation a été introduite par certains IDE producteurs.

D'accord, d'accord, en tant que développeur, vous savez que les " []", est lié à un tableau en PHP. Mais que faire d'un "quelque chose[]" dans PHP normal contexte? "[]" signifie: créer un nouvel élément à l'intérieur de "quelque chose". Le nouvel élément pourrait être tout. Mais ce que vous voulez exprimer est: tableau d'objets avec le même type et de sa nature exacte. Comme vous pouvez le voir, l'IDE producteur introduit un nouveau contexte. Un nouveau contexte que vous avez dû apprendre. Un nouveau contexte d'autres développeurs PHP ont eu à apprendre (pour comprendre vos éléments). Mauvais style (!).

Parce que votre tableau ne ont une dimension peut-être vous voulez l'appeler "tableau d'objets" a "liste". Être conscient que la "liste" a une signification spéciale dans d'autres langages de programmation. Il serait mutch mieux de l'appeler "collection" par exemple.

Rappelez-vous: vous utilisez un langage de programmation qui vous permet toutes les options de la programmation orientée objet. Utiliser une classe au lieu d'un tableau et faire de votre classe traversable comme un tableau. E. g.:

class orderCollection implements ArrayIterator

Ou si vous le souhaitez stocker les objets internes sur différents niveaux au sein d'un multi-dimensionnelle tableau/objet de la structure:

class orderCollection implements RecursiveArrayIterator

Cette solution remplace votre tableau par un objet de type "orderCollection", mais de ne pas activer la complétion de code dans votre IDE jusqu'à présent. Ok. Prochaine étape:

Mettre en œuvre les méthodes qui sont introduites par l'interface avec des éléments en particulier:

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()

N'oubliez pas d'utiliser le type de conseils de:

orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)

Cette solution s'arrête l'introduction d'un lot de:

/** @var $key ... */
/** @var $value ... */

l'ensemble de vos fichiers de code (par exemple, dans les boucles), comme Zahymaka confirmé avec sa réponse. Votre API utilisateur n'est pas obligé de la présenter éléments, d'avoir la complétion de code. Pour avoir @return sur un seul endroit réduit la redondance (@var) mutch que possible. Saupoudrer les "éléments avec @var" serait de rendre votre code pire lisible.

Finalement vous avez terminé. Semble difficile à atteindre? Regarde comme prendre une masse pour casser une noix? Pas vraiment, puisque vous êtes familier avec les interfaces et avec un code propre. Rappelez-vous: votre code source est écrit une fois / lire beaucoup.

Si la complétion de code de votre IDE ne fonctionnent pas avec cette approche, passer à un meilleur (par exemple, IntelliJ IDEA, PhpStorm, Netbeans) ou déposer une demande de fonctionnalité sur le bug tracker de votre IDE producteur.

Merci à Christian Weiss (de l'Allemagne), pour avoir été mon formateur et pour l'enseignement de moi comme un grand truc. PS: à la rencontre de moi et lui sur XING.

5voto

d.raev Points 1382

Dans NetBeans 7.0 (peut être moins), vous pouvez déclarer le type de retour "tableau avec les objets de Texte ", comme @return Text et le code allusion:

Edit: mise à jour de l'exemple avec @Bob Fanger suggestion

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

et il suffit d'utiliser:

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

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

Il n'est pas parfait mais c'est mieux que de simplement laisser juste "mixte", qui n'apporte aucune valeur.

Les INCONVÉNIENTS c'est que vous êtes autorisé à fouler le tableau comme Objet Texte sorcière va générer des erreurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X