Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Iteratory - jak działa ta klasa ?, HELP
fiasko
post
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 1
Dołączył: 1.06.2010

Ostrzeżenie: (0%)
-----


  1. class QueryIterator implements Iterator
  2. {
  3. private $result;
  4. private $connection;
  5. private $data;
  6. private $key=0;
  7. private $valid;
  8. function __construct($dbname, $user, $password)
  9. {
  10. $this->connection = pg_connect("host=localhost port=5432 dbname={$dbname} user={$user} password={$password}");
  11. }
  12. public function exceute($query)
  13. {
  14. $this->result = pg_query($this->connection,$query);
  15. if (pg_num_rows($this->result)>0)
  16. $this->next();
  17. }
  18. public function rewind() {}
  19. public function current()
  20. {
  21. return $this->data;
  22. }
  23. public function key()
  24. {
  25. return $this->key;
  26. }
  27. public function next()
  28. {
  29. if ($this->data = pg_fetch_assoc($this->result))
  30. {
  31. $this->valid = true;
  32. $this->key+=1;
  33. }
  34. else
  35. $this->valid = false;
  36. }
  37. public function valid()
  38. {
  39. return $this->valid;
  40. }
  41. }
  42.  
  43.  
  44.  
  45. $qi = new QueryIterator("moja_baza", "use5454" , "65454544444");
  46. $qi -> exceute("select name, email from users");
  47. while ($qi -> valid())
  48. {
  49. echo "<pre>";
  50. print_r($qi -> current());
  51. echo "</pre>";
  52. $qi -> next();
  53. }


Staram się zrozumieć działanie tej klasy. Ale nie do końca wiem co się dzieje .

Zacznę więc od początku :

W utworzonej instancji klasy QueryIterator wywołujemy metodę konstruktora i łączymy się z bazą postgresql.
Następnie wywołujemy metodę exceute w której tworzymy zapytanie do bazy danych na podstawie utworzonego identyfikatora połączenia właściwości connection i zaptyania query. Następnie przypisujemy wynik do właściwości result. Następnie sprawdzamy czy zapytanie zwróciło nam co najmniej jeden wiersz i jeśli tak to wywołujemy kolejna metodę next().

Tu tez nie rozumiem dlaczego ona musi nazwać się next() skoro to nazwa metody ? Z tego co mi się wydaje w definicji metody next(); jej dziłanie jest następujące.
z wyniku zapytania czyli z właściwości result tworozna jest tablica asocjacyjna, która zwraca wynik do właściwości data. Właściwość valid w przypadku pozytywnego zwrócenia wyniku otrzymuje wartość true, a właściwość key zwiększa swoją wartość klucza z 0 o jeden z każdym wywołaniem metody next . Oczywiście wartość false dla właściwości valid wystąpi gdy wywołanie metody nastąpi gdy pg_fetch_assoc nie zwróci wyniku.

No a co dalej to już nie mam pojęcia.

Bo nie wiem co się dzieje i jak są wywoływane metody
public function rewind() {}
public function current()



Proszę o jakieś wytłumaczenie jak działa ta klasa. Niestety autor książki nie opisał, dokładnie sposobu działania klas i tak muszę sam dociekać co i jak .

Dlatego proszę o napisanie co się dzieje dalej.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Zaprezentowana klasa QueryIterator pozwala na sekwencyjne (jeden po drugim) przejrzenie wyników dowolnego zapytania do bazy danych PostgreSQL. Nie realizuje ona jednak wszystkich możliwości Iteratora np. ze względu na to, że wyniki mogą być przeglądane tylko do przodu, nie można ich przejrzeć ponownie, ani też wrócić do poprzedniego.

Cytat
Nie wiem też co za różnicę robi $this->key+=1; bo za komentowanie tej linii powoduje dalej poprawne działanie klasy.

Akurat w przedstawionej klasie key (klucz, index) nie jest wykorzystywany. Natomiast key() pobiera indeks elementu tablicy, który aktualnie przeglądamy.

Cytat
Nadal nie rozumiem jednak w jaki sposób current() wie, że wywołałem metodę next() na tej tablicy $data i że zwiększyłem dla na niej wskaźnik.

Metoda current() wcale nie wie, że wywołałeś metodę next(). Zauważ tylko, że zarówno current() jak i next() operują na tej samej zmiennej $this->data, przy czym current() pobiera wartość tej zmiennej, a next() tę wartość nadpisuje.

Natomiast metoda rewind() (pol. przewiń) powinna przywrócić nam stan początkowy, ale tutaj również nie jest wykorzystywana.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 22:52