2014-12-03 13 views
5

specyfikiPodpowiedź iterator ścisłych typu podmiotów w PHPDoc

  • używam PHPStorm 8 IDE.
  • Załóżmy, że mamy jakąś klasę Foo, która implementuje interfejs \Iterator i wiemy, że wszystkie elementy wewnątrz tego iteratora będą na przykład klasy Bar.

Pytanie

Jak schować że Foo jest iterable i zawiera tylko elementy Bar? Oczywiście, wskazówka powinna zachować informację, że jest to instancja Foo

co starałem tak daleko

Gdybyśmy mieli tablicę Bar przypadkach, to jest rzeczą prostą (nie jest to opisane, na przykład, w pytaniu this): Bar[]. Ponadto, jeśli zamiarem jest iterację Foo, to nadal może być rozwiązana (bardziej lub mniej) z:

//assume that $foo is instance of Foo 
//.. 

/* @var $object Bar */ 
foreach ($foo as $object) { 
} 

Jednak jest jedna bardzo ważna rzecz, która nie jest osiągalna z in-place podpowiedzi: typ zwracany . Jeśli będę miał jakąś metodę, która powinna zwrócić Foo, wiem tylko, jak wskazać, że Foo, ale użytkownik tej funkcji nadal nie będzie w stanie narazić się, że jest w rzeczywistości iterowalna i zawiera instancje Bar (jak byłoby, gdybym ja „ll określić @return Bar[] w przypadku z tablicy Bar przypadkach)

Odpowiedz

3

Jeśli Foo narzędzia Iterator następnie można schować typ zwracany na Foo::current(). PHPStorm rozpozna, że ​​to, co zwraca Foo::current(), jest wartością, gdy foreach przez .

Na przykład:

<?php 

class Foo implements Iterator 
{ 
    // ... 

    /** 
    * @return Bar 
    */ 
    public function current() 
    { 
     // ... 
    } 

    // ... 
} 

$foo = new Foo(); 

foreach ($foo as $object) { 
    // PHPStorm will recognise $object is type Bar. 
}