2016-07-19 11 views
0

私の問題は、メソッドから適切なタイプのオブジェクトを取得しています。メソッドは、継承のために「混合」タイプを返します。父親から継承したメソッドから子タイプのオブジェクトを取得する

私はこのような一般的なクラスがN異なるリストによって拡張されている一般的なクラスのいずれか

class Item 
{ 
    /** 
    * @var string 
    */ 
    protected $name; 

    public function __construct($name) 
    { 
     $this->name = $name; 
    } 
} 

あるタイプ項目の要素を含む汎用リストクラス

class List 
{ 
    /** 
    * @var Item[] 
    */ 
    protected $items; 

    public function __construct() 
    { 
     $this->items = array(); 
    } 

    /** 
    * @return Item[] 
    */ 
    public function getAll() 
    { 
     return $this->items; 
    } 


    /** 
    * @return Item 
    */ 
    public function getOne($index) 
    { 
     if (isset($this->items[$index])) { 
      return $this->items[$index]; 
     } 
     return null; 
    } 
} 

を持っています。単なる例(父親から継承)私のgetAllメソッドは、[]項目を返す、または混合されているので、私は、コード補完を持っていないforeachの内部

class UserList extends List 
{ 
    /* user-specific implementation */ 
} 

class User extends Item 
{ 
    /* user-specific implementation */ 
} 
クライアントコードで

$user_list = new UserList(); 
foreach ($user_list->getAll() as $user) { 
    echo $user->getEmailAddr(); 
} 

[]、User []ではありません。 getOneメソッドと同じ問題です。 私はそのようなメソッドをオーバーライドする必要はありません。

もっと巧妙で洗練されたソリューションがありますか? ありがとうございました

+0

ほとんどのIDEを使用すると、反復で使用されているどのタイプそれを伝えることで彼らを助けるための方法を提供します関連の質問を参照してください。 – PeeHaa

答えて

1

IDEが自動的に型を推論する方法はありません。 phpdocのタイプの注釈を使用します。

foreach ($user_list->getAll() as $user) { 
    /** @var User $user */ 
    echo $user->getEmailAddr(); 
} 

PHPDoc type hinting for array of objects?

+0

素晴らしい!どうもありがとう – user2029958

関連する問題