2016-07-19 13 views
0

Mein Problem ist das Abrufen des richtigen Objekttyps aus einer Methode, die aufgrund von inhistory einen "gemischten" Typ zurückgibt.Abrufen des untergeordneten Typs eines Objekts aus einer vom Vater geerbten Methode

Ich habe eine generische Liste Klasse bekam

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; 
    } 
} 

enthält Element vom Typ Element, das eine generische Klasse ist entweder

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

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

Solche generische Klassen erweitert werden durch N verschiedene Listen. Nur ein Beispiel

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

class User extends Item 
{ 
    /* user-specific implementation */ 
} 

Im Client-Code

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

Innerhalb des foreach ich nicht Code-Vervollständigung, weil meine getAll Methode (vom Vater geerbt) zurückkehrt Item [] oder gemischt [], kein Benutzer []. Dasselbe Problem mit der getOne-Methode. Ich möchte solche Methoden nicht überschreiben müssen.

Gibt es eine cleverere und elegantere Lösung? Vielen Dank

+0

Die meisten IDEs werden einen Weg für Sie, um ihnen zu helfen, indem Sie angeben, welche Art in der Iteration verwendet wird. – PeeHaa

Antwort

1

Ich denke nicht, dass es eine Möglichkeit für die IDE gibt, den Typ automatisch abzuleiten. Verwenden Sie eine phpdoc Typanmerkung:

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

Siehe die damit verbundene Frage PHPDoc type hinting for array of objects?

+0

Großartig! Danke vielmals – user2029958

Verwandte Themen