2010-02-24 4 views
2

Je travaille sur des modèles Magento, mais ce problème s'appliquerait à n'importe quel système de chargement de modèles. Comme ces modèles sont chargés par le moteur de gabarit, l'EDI (dans ce cas, Aptana) n'a aucun moyen de savoir quel est le type d'objet $ this.

Potentiellement, plusieurs objets pouvaient charger plusieurs objets en un seul modèle, mais en ignorant cela, quelle serait la syntaxe correcte de phpdoc pour spécifier une classe spécifique pour cet objet?

Répondre

3

Vous pouvez définir comme ceci:

/* @var $this type */ 

où type est un nom de classe

+0

Merci, sonne bien, mais ne fonctionne pas dans Aptana - il reconnaît $ ceci comme un mot-clé et ne le liera pas au type var défini – benz001

+0

Fonctionne très bien sur PhpStorm, mais pas sur Eclipse Indigo et versions inférieures ... N'a pas testé sur Juno, cela dit. –

0

Pour être clair, en utilisant $ cette ne devrait jamais indiquer un objet du courant classe, non?

PhpDocumentor ne reconnaît pas actuellement (v1.4.3) $ ce en tant que mot-clé spécifique qui doit correspondre à un type de données de la classe elle-même.

Seuls les types de données connus par PHP et les classes déjà analysées par PhpDocumentor sont les valeurs de type de données correctes à utiliser avec la balise @return. PhpDocumtentor propose une option permettant de documenter les méthodes courantes qui "retournent $ this". [1]

Dans le cas de la balise @var, je ne vois pas comment une variable de classe pourrait contenir sa propre instance de classe. En tant que tel, je ne peux pas suivre ce que "@var $ this" devrait dire.

Si, cependant, votre intention avec $ ce est pas pour les méthodes couramment que « return $ ce », et était tout simplement d'être un peu raccourci vers PhpDocumentor et/ou votre IDE deviner par magie ce que vous DataTypes pourrait signifie en utilisant $ ce, je devrais deviner il n'y a aucun moyen de le faire. La suggestion la plus proche que je pourrais faire serait d'utiliser le nom d'une classe parent qui est un parent commun à toutes les différentes classes enfants que ce var/return particulier pourrait être à l'exécution, puis utiliser la partie description de la balise pour avoir en ligne {@link} balises répertoriant les classes enfants possibles. Exemple: J'ai une classe abstraite parent avec les enfants Child1, Child2 et Child3 que chaque peut avoir dans ma classe Foo d'exécution. Donc, Foo :: _ var pourrait être l'un de ces types de classe enfant à l'exécution, mais comment est-ce que je documenterais cela?

 
/** 
* @var Parent this could be any child of {@link Parent}, {@link Child1}, {@link Child2}, or {@link Child3}... 
*/ 
protected $_var; 

Pour en revenir à la question « retourner ce $ », je voudrais documenter les choses d'une manière similaire:

 
/** 
* a fluent method (i.e. it returns this class's instance object) 
* @return Parent this could be any child of {@link Parent}, {@link Child1}, {@link Child2}, or {@link Child3}... 
*/ 
public function foo() { 
    return $this; 
} 

Documenter cette façon au moins permet à votre classe doc d'avoir des liens avec le particulier Des classes. Ce qu'il ne parvient pas à faire, c'est mettre en évidence le couramment 'ness. Cependant, si votre IDE est capable de reconnaître les noms de classe, alors il sera peut-être capable de faire le lien logique nécessaire avec ces autres classes.Je pense qu'Eclipse est capable de le faire au moins avec une aide contextuelle, si vous passez la souris sur le nom de la classe dans la description de la balise. Je pense que pas pense qu'Eclipse peut utiliser ceci pour rendre les diverses méthodes des classes enfants disponibles dans le code. Il connaîtrait les méthodes Parent pour la complétion de code, car le type de données que je liste explicitement est Parent, mais c'est aussi loin que l'EDI peut aller.

[1] - http://pear.php.net/bugs/bug.php?id=16223

+0

Dans ce cas, mon problème provient du système de gabarit dans le cadre. Les modèles sont essentiellement des extraits de code php qui ne reçoivent qu'un contexte lors de l'exécution. Donc, je cherche essentiellement une syntaxe pour 'tromper' l'IDE d'Aptana en définissant la portée de $ this à un type de classe particulier, dans le scénario Magento tous les modèles dérivent de Mage_Core_Block_Template donc pouvoir les lier à ce serait un bon début, dans la plupart des cas, vous pouvez aller un peu mieux et lier le modèle x à Custom_X_Block_Template en toute sécurité. – benz001

0

J'ai trouvé que la définition d'un type avec @var pour $ cela ne fonctionne pas - sans doute parce que $ c'est spécial et est traité comme tel par Aptana. J'ai un besoin similaire à l'affiche je pense - c'est dans les fichiers modèles (dans mon cas, simplement localisés et inclus par les fonctions dans la classe de données) que je souhaite définir un type pour $ this. Comme le dit @ashnazg, définir un type pour $ this dans une définition de classe n'est pas nécessaire, car le type de $ this est toujours le type de la classe (jusqu'à l'héritage).

Il existe cependant une solution de contournement pour les fichiers de modèle. Au sommet du fichier modèle tout simplement quelque chose comme

/** 
* @var My_Data_Model_Type 
*/ 
$dataModel = &$this; 

Ensuite, utilisez simplement $dataModel (ou tout ce que vous choisissez de l'appeler - peut-être quelque chose de plus court) au lieu de $this dans le modèle

Questions connexes