2017-08-08 2 views
2

En général, voici comment je reçois mon IDE (PhpStorm 2017) de reconnaître le type d'une variable que je ne reçois pas de déclarer officiellement:PHPDoc et PhpStorm: indiquent le type de retour d'une méthode magique

/* 
* @var User $user 
*/ 
foreach($users as $user){} 

L'EDI sait alors que $user est de classe User. Maintenant, je suis face à une situation avec cette ligne:

Yii::app()->user->login() 

Plus précisément, l'IDE n'a aucune idée de quel type user est. Je reçois l'avertissement:

Champ accessible via la méthode magique

J'ai donc essayé de préciser avec:

/** 
* @var User Yii::app()->user 
*/ 
Yii::app()->user->login(); 

Mais cela ne fait pas de différence. Comment puis-je aider l'EDI à résoudre le type?

+2

* "J'ai donc essayé de préciser avec:'/** @var utilisateur :: Yii app() -> user */'" * - cela ne fonctionne pas comme ça - de cette façon, vous pouvez taper seulement une variable de premier niveau - pas une propriété d'une autre classe. Le meilleur moyen est d'aller avec la réponse de @ Dmitry si vous avez besoin d'un tel indice une seule fois (mais il peut * avoir * des effets secondaires)). Sinon faites-le localement via une variable intermédiaire comme le suggère @Nima (mais vous devrez le faire à chaque endroit où vous l'utiliserez). – LazyOne

+0

Une alternative mais une solution possible - passez 'Yii :: app() -> user' comme paramètre à votre appel de constructeur/méthode de classe etc - de cette façon, vous pouvez facilement taper la variable de classe interne. – LazyOne

+0

@LazyOne: "* Le meilleur moyen est d'aller avec la réponse de Dmitry si vous avez besoin d'un tel indice une seule fois *" La réponse de Dmitry semble fonctionner partout Yii :: app() -> user' apparaît non seulement au même endroit. Je l'essaie avec juste sa 2ème classe ('CApplication'); Je ne sais pas ce que les effets secondaires seraient – BeetleJuice

Répondre

5

Créer dans le fichier phpdoc.php de projet et mettre à côté:

<?php 

/** 
* Class Yii 
* @method static CApplication app() 
*/ 
class Yii extends YiiBase 
{ 
} 

/** 
* Class CApplication 
* 
* @property User $user 
*/ 
class CApplication extends CModule 
{ 
} 
+0

+1! Quelques questions: 1) Si je supprime la première classe «Yii», cela fonctionne toujours. Est-ce nécessaire? ('Yii' est déjà déclaré dans une bibliothèque de fournisseur, tout comme' CApplication'). 2) le nom de fichier * phpdoc.php * a-t-il une signification particulière? – BeetleJuice

+0

Je vous ai enlevé la première classe et cela fonctionne toujours, alors c'est d'accord. phpdoc.php nom n'est pas spécial, il montre juste que ce fichier utilisé pour les indications. – Dmitry

3

Vous devez affecter Yii::app()->user (ou toute autre propriété magique) à une nouvelle variable et informer votre IDE de cette variable. Comme:

/** 
* @var User $user 
*/ 
$user = Yii::app()->user; 
$user->login(); 
+0

Hey Nima. Upvote. Merci, c'est la seule solution à laquelle je puisse penser. Je me demandais simplement s'il y en avait un plus élégant. – BeetleJuice