2016-03-25 2 views
1

J'imagine que je pourrais avoir besoin d'ajouter une annotation spéciale quelque part, mais je croise les doigts que PhpStorm est assez intelligent pour résoudre les types de retour étant donné les modèles d'héritage maladroit.Est-il possible que PhpStorm déduise le type de retour de cette méthode?

Par exemple, j'ai un code qui ressemble à ceci:

<?php 

class Collection extends \ArrayObject 
{ 
    public function __construct(array $items) 
    { 
     foreach ($items as $key => $value) { 
      if (isset(static::$requiredType) && !$item instanceof static::$requiredType) 
       $this->offsetSet($key, $value); 
     } 
    } 

    public function getFirst() 
    { 
     return $this->offsetGet(0); 
    } 
} 

class MessageCollection extends Collection 
{ 
    protected static $requiredType = 'Message'; 
} 

class UserCollection extends Collection 
{ 
    protected static $requiredType = 'User'; 
} 

Je voudrais si quand je l'appelle UserCollection::getFirst() il déduit qu'un User a été retourné, alors que quand je l'appelle MessageCollection::getFirst() il déduit qu'un Message a été retourné. Y a-t-il des annotations que je pourrais mettre quelque part pour atteindre ce résultat?

Ma première pensée était quelque chose comme ceci:

/** 
    * @return Message|User|XXXX|YYYY|ZZZZ|AAAA|BBBB|CCCC|DDDD 
    */ 
    public function getFirst() 
    { 
     return $this->offsetGet(0); 
    } 

mais j'imagine que cela obtenir un peu ridicule au point d'être inutile que j'ajouter des classes de collection.

Répondre

2

Essayez ceci:

/** 
* @method \User getFirst() 
*/ 
class UserCollection extends Collection 
{ 
    protected static $requiredType = 'User'; 
} 
+0

J'aime cette pensée. Y a-t-il une chance qu'une annotation similaire fonctionne avec les boucles 'foreach'? – johncorser

+0

vous pouvez utiliser quelque chose comme ceci pour foreach: '/ ** @var \ User [] $ items * /'. – Dmitry

+0

Je ne sais pas comment je pense à jeter des commentaires comme ça dans mon code à chaque fois que j'écris une boucle foreach ... – johncorser