Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Iterator - dlaczego to działa?
Forum PHP.pl > Forum > PHP > Object-oriented programming
spokoloko123
  1. <?
  2. class QueryIterator implements Iterator
  3. {
  4. private $result;
  5. private $connection;
  6. private $data;
  7. private $key=0;
  8. private $valid;
  9.  
  10. function __construct($host, $user, $password, $dbname)
  11. {
  12. $this->connection = mysql_connect($host, $user, $password);
  13. mysql_select_db($dbname);
  14. }
  15. //wykonujemy zapytanie o imiona i email
  16. public function exceute($query)
  17. {
  18. $this->result = mysql_query($query);
  19. if (mysql_num_rows($this->result)>0)
  20. $this->next();
  21. }
  22. public function rewind() {}
  23. public function current()
  24. {
  25. return $this->data;
  26. }
  27. public function key()
  28. {
  29. return $this->key;
  30. }
  31. //dane zapisywane są w $data, $valid=true, $key++
  32. public function next()
  33. {
  34. if ($this->data = mysql_fetch_assoc($this->result))
  35. {
  36. $this->valid = true;
  37. $this->key+=1;
  38. }
  39. else
  40. $this->valid = false;
  41. }
  42. public function valid()
  43. {
  44. return $this->valid;
  45. }
  46. }
  47.  
  48. $qi = new QueryIterator("localhost", "user", "pass", "test");
  49. $qi->exceute("SELECT name, email FROM users");
  50. while($qi->valid())
  51. {
  52. print_r($qi->current());
  53. $qi->next();
  54. }
  55. ?>


Nie wiem za bardzo dlaczego to działa ;P. Funkcja key nie jest nigdzie używana a po jej usunięciu wywala błąd.
greycoffey
Manual -> "implements Iterator", poszukaj o tym interfejsie
spokoloko123
jak wywale implements Iterator to nadal działa
greycoffey
Poczytales o tym interfejsie? Chyba nie...
spokoloko123
To inaczej... kiedy ten warunek będzie nie prawdziwy?
  1. $this->data = mysql_fetch_assoc($this->result)
bastard13
Ten 'warunek' będzie fałszywy, jeżeli funkcja mysql_fetch_assoc zwróci Ci false (w podlinkowanej stronie jest napisane kiedy).
spokoloko123
Dobra, widzę, że ktoś ogarnia wink.gif (@bastard13). Są postępy ;P tylko jedna rzecz w iteratorach mi nie daje spokoju. Skąd next() i current() wiedzą, że ten jest koleny, a ten wiersz jest obencnie potrzebny? Czy to coś w rodzaju pętli? Nie wiem czy się dobrze wyraziełem... ale skąd wiadomo (ja wiem, ale skąd to wie PHP) która zmienna przechowuje tablice by przejścia przez nią?
tehaha
Każda tablica ma wewnętrzny wskaźnik, funkcja mysql_fetch_assoc() pobiera tablicę i przesuwa wskaźnik, dlatego przy następnym wywołaniu pobierze kolejny element, funkcja zwróci FALSE kiedy nie będzie już więcej wyników do zwrócenia
Cytat
Returns an associative array that corresponds to the fetched row and moves the internal data pointer ahead
-> http://www.php.net/mysql_fetch_assoc
spokoloko123
"normalnie" do zmiennej została by zapisana cała tablica a tu tylko jeden wiersz... do czego to zależy i co to definiuje, że będzie przypisany tylko ten jeden wiersz a nie wszystkie?
tehaha
Cytat
"normalnie" do zmiennej została by zapisana cała tablica a tu tylko jeden wiersz
Normalnie czyli jak? Możesz podać przykład? Nie bardzo rozumiem o co Tobie chodzi. Wysyłasz zapytanie do bazy danych funkcją mysql_query(), która w przypadku zapytania SELECT zwraca zasób . Zasób posiada wskaźnik wewnętrzny, który trzyma wartość "obecnego" rekordu. Funkcja mysql_fetch_array() zwraca jeden rząd z zasobu w postaci tablicy asocjacyjnej i przesuwa wskaźnik wewnętrzny na kolejny rząd w zasobie. To, że następuje tutaj przesunięcie tego wskaźnika wynika z działania funkcji mysql_fetch_array(), która sprawdza wartość wskaźnika, pobiera rząd wyników i przesuwa wskaźnik. Możesz samodzielnie przesuwać ten wskaźnik funkcją mysql_data_seek().

Wydaje mi się, że to co Tobie się myli to ten zasób, który przekazujesz do funkcji mysql_fetch_array() - to nie jest to samo co wielowymiarowa tablica, to jest specjalny typ zmiennej.
greycoffey
  1. <?php
  2. $array = array(0,1,2,3,4);
  3. for($i=0 /* $i to tak jakby wskaźnik */;$i<count($array);++$i /* tutaj robimy jakby next*/)
  4. {
  5. echo $array[$i].PHP_EOL;
  6. }

W tym wypadku $i jest wskaźnikiem, next() go inkrementuje, rewind() ustawia na 0.
key() zwraca klucz danego obiektu, a current() wartosc.
spokoloko123
A ok haha.gif to dużo wyjaśnia. A da się ten zasób jakoś przypisać (tak z ciekawości)?
Wiem, że Iterator jest głównym interfejsem, który definiuje metody, ale po usunięciu jego implementacji nadal wszystko działa jak należy... więc o co chodzi?
greycoffey
Działa bo to:
  1. while($qi->valid())
  2. {
  3. print_r($qi->current());
  4. $qi->next();
  5. }

można zamienić na:
  1. foreach($qi as $value)
  2. {
  3. echo $value;
  4. }

Jeśli jest zdefiniowany interfejs wink.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.