Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: current() na obiekcie
Forum PHP.pl > Forum > PHP > Object-oriented programming
ayeo
Przykładowy kod:
  1. <?php
  2. class Shit implements Iterator
  3. {
  4.    private $var = array();
  5.  
  6.    public function __construct($array)
  7.    {
  8.        if (is_array($array)) {
  9.            $this->var = $array;
  10.        }
  11.    }
  12.  
  13.    public function rewind()
  14.    {
  15.        reset( $this->var );
  16.    }
  17.  
  18.    public function current()
  19.    {
  20.        return current($this->var);
  21.    }
  22.  
  23.    public function key()
  24.    {
  25.        return key( $this->var );
  26.    }
  27.  
  28.    public function next()
  29.    {
  30.        return next( $this->var );
  31.    }
  32.  
  33.    public function valid()
  34.    {
  35.        return $this->current() !== false;
  36.      }
  37.  
  38. }
  39.  
  40.  
  41. $it = new Shit( array( 1,2,3 ) );
  42.  
  43. var_dump( current( $it ) );  //array(3) {   [0]=>   int(1)   [1]=>   int(2)   [2]=>   int(3) }
  44. ?>


Pytanie brzmi: czy można na obiekcie implementującym interfejs Iterator użyć funkcji current() ? Chodzi mi o to, żeby otrzymać wynik podobny do działania:
  1. <?php
  2. function current2( $it )
  3. {
  4.    foreach( $it as $i ) return $i;
  5. }
  6. ?>


Z góry dziękuję za poświęcony czas.

Pozdrawiam!
webdice
Czemu nie użyjesz po prostu:

  1. <?php
  2. $it -> current ();
  3. ?>
ayeo
Witam!

Dzięki za odpowiedź, jednak mi chodzi bardziej o zrozumienie dlaczego to nie działa i jak zrobić, żeby działało smile.gif Mogę oczywiście zrobić tak jak piszesz, ale nie w tym rzecz.

Pozdrawiam!
starach
Bo wskaźnik tablicy jest ustawiany na pozycję początkową kiedy zwracasz wartość. Gdyby tak można było interfejs iteratora nie wymagłaby 5 metod.
ayeo
~orglee, dziękuję za odpowiedź, ale nie do końca rozumiem. Mógłbyś troszkę jaśniej? W manualu nic nie znalazłem o tym. Pozdrawiam!
erix
A tak BTW, to nie lepiej skorzystać do tego celu z ArrayObject? W sumie powyższy kod tylko wynajduje tablicę na nowo; skoro zależy Ci na current, IMHO lepiej byłoby skorzystać właśnie z ArrayObject. Iterator, to raczej byłby bardziej przydatny do czynności typu obsługa danych z bazy, listingi katalogów, itp, w których nie jest konieczne odwoływanie się do konkretnego klucza.

Zresztą, pogooglaj, sam wyciągniesz wnioski. winksmiley.jpg
Hacker
Funkcja current działa niezależnie od implementowanego interfejsu.
Tymi to funkcjami (current, next, prev) możemy dostać się do pól obiektu, nie wywołują one metody current obiektu, a jedynie zwracają jego pola.
Gdyby klasa posiadała jeszcze jakieś pole, to mógłbyś się do niego dostać nextem.
starach
  1. <?php
  2. function current2($it)
  3. {
  4.    $keys = array_keys($it);
  5.    for($i = 0; $i < count($keys); $i++)
  6.    {
  7.        return $it[$keys[$i]];
  8.    }
  9. }
  10.  
  11. echo current2(array("element_1", "element_2"));
  12. ?>
Żeby foreach w current2() zwracało ci za każdym razem następny element tablicy, musiałbyś przechowywać wskaźnik tablicy czyli w moim przykładzie $i, na zewnątrz metody. Przykładowo w zmiennej statycznej lub klasowej. Ale na dobrą sprawę nie widzę tym sensu.
edit>
Oczywiście istnieje jeszcze prawdopodobieństwo że nie zrozumiałem o co chodzi. tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.