Comment puis-je utiliser les astuces docblock avec des classes pour les variables $this ?
-
14-11-2019 - |
Question
J'utilise NetBeans comme IDE.Chaque fois que j'ai du code qui utilise une autre fonction (généralement une usine) pour renvoyer un objet, je peux généralement procéder comme suit pour faciliter les indications :
/* @var $object FooClass */
$object = $someFunction->get('BarContext.FooClass');
$object-> // now will produce property and function hints for FooClass.
Cependant, lorsque j'utilise la propriété d'un objet pour stocker cette classe, je ne sais pas comment faire de même, car trying to use @var $this->foo or @var foo
ne transmettra pas l'allusion :
use Path\To\FooClass;
class Bar
{
protected $foo;
public function bat()
{
$this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass
$this->foo //does not have hinting in IDE
}
}
J'ai essayé dans le docblock pour la classe, ou en utilisant les commentaires en ligne ci-dessus protected $foo
ou où foo est défini sur l'instance.
La seule solution que j'ai trouvée jusqu'à présent est de :
public function bat()
{
$this->foo = FactoryClass::get('Foo');
/* @var $extraVariable FooClass */
$extraVariable = $this->foo;
$extraVariable-> // now has hinting.
}
J'aimerais vraiment que l'indication soit à l'échelle de la classe, car de nombreuses autres fonctions pourraient potentiellement l'utiliser. $this->foo
, et connaître les méthodes et propriétés de la classe serait utile.
Il existe sûrement un moyen plus simple...
La solution
Je ne peux pas dire comment cela fonctionne dans Netbeans, mais à PHPeclipse, vous ajouteriez l'indice à la déclaration de la variable elle-même:
use Path\To\FooClass;
class Bar
{
/**
* @var FooClass
*/
protected $foo;
public function bat()
{
$this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass
$this->foo // should now have hinting
}
}
Autres conseils
Donné
class Bar
{
protected $foo;
public function bat()
{
$this->foo = FactoryClass::get('Foo'); // Returns an instance of FooClass
$this->foo //does not have hinting in IDE
}
}
L'IDE essaie d'obtenir la déclaration de FactoryClass::get
qui n'a probablement pas de type de retour docblock.Le problème est que si cette méthode d'usine peut renvoyer un nombre quelconque de classes, vous ne pouvez pas faire grand-chose à part utiliser votre solution de contournement.
Sinon, il ne fera pas la différence entre FactoryClass::get('Foo')
ou FactoryClass::get('Bar')
puisque ces deux appels renverraient très probablement des objets de types différents.