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
fiasko
post
Post #2





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

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


No ale przecież metoda next() nie operuje bezpośrednio na tej tablicy bo nie ma żadnego akcesora dostępu do właściwości $data. Równie dobrze mogę jej nie używać i np zadeklarować tą podobną metodę tak :

  1. public function next_step() {
  2. echo "next<br>";
  3. if ($this->data = pg_fetch_assoc($this->result))
  4. {
  5. $this->valid = true;
  6. //$this->key+=1;
  7. echo "klucz" . $this -> key."<br>";
  8. }
  9. else {
  10. $this->valid = false;}
  11. echo $this->valid;
  12. }


Efekt będzie taki, że z każdym wywołaniem tej metody indeks zwiększy się o jeden. - sprawdziłem

Doszedłem do wniosku, że poprawnie i sensownie wykorzystywana jest w przykładzie tej klasy tylko pokryta metoda current() dla klasy abstrakcyjnej, która potrafi odczytać bieżący wskaźnik . Troszkę autor książki chyba nie wiedział jak sensownie przedstawić działanie tej klasy. Generalnie nie polecam książki programowanie obiektowe w PHP5 Hasin Hayder ze względu na ilość błędów w kodzie oraz zupełnie nie trafione przykłady. Zero tłumaczenia co, jak, lub dlaczego.

  1. <?
  2. <?
  3. class QueryIterator implements Iterator
  4. {
  5. private $result;
  6. private $connection;
  7. private $data;
  8. private $key=0;
  9. private $valid;
  10. function __construct($dbname, $user, $password)
  11. {
  12. $this->connection = pg_connect("host=localhost port=5432 dbname={$dbname} user={$user} password={$password}");
  13. }
  14. public function exceute($query)
  15. {
  16. $this->result = pg_query($this->connection,$query);
  17. if (pg_num_rows($this->result)>0)
  18.  
  19. $this-> next_step();
  20.  
  21. }
  22. public function rewind() {
  23.  
  24. }
  25. public function current()
  26. {
  27.  
  28. return $this->data;
  29. }
  30.  
  31. public function key()
  32. {
  33.  
  34. }
  35.  
  36. public function next()
  37. {
  38.  
  39. }
  40. public function next_step() {
  41.  
  42. if ($this->data = pg_fetch_assoc($this->result))
  43. {
  44. $this->valid = true;
  45. }
  46. else {
  47. $this->valid = false;}
  48. }
  49.  
  50. public function valid()
  51. {
  52. return $this->valid;
  53. }
  54.  
  55. }
  56.  
  57.  
  58.  
  59. $qi = new QueryIterator("moja_baza", "usr_" , "65545421");
  60. $qi -> exceute("select name, email from users");
  61.  
  62.  
  63.  
  64. while ($qi -> valid())
  65. {
  66. echo "<pre>";
  67. print_r($qi -> current());
  68. echo "</pre>";
  69. $qi -> next_step();
  70. }
  71.  
  72.  
  73.  
  74. ?>
  75.  


Ten post edytował fiasko 16.08.2011, 12:41:31
Go to the top of the page
+Quote Post
mortus
post
Post #3





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

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


Cytat(fiasko @ 16.08.2011, 13:39:20 ) *
No ale przecież metoda next() nie operuje bezpośrednio na tej tablicy bo nie ma żadnego akcesora dostępu do właściwości $data.

Jak to nie?
  1. if($this->data = pg_fetch_assoc($this->result))

Przecież to jest przypisanie zmiennej $this->data wiersza wyciągniętego z $this->result. Jeśli nie ma więcej wyników, to pg_fetch_assoc() zwraca false.
Metoda next() również spełnia swoją rolę (przynajmniej po części).

Natomiast sama klasa QueryIterator, nie do końca wykorzystuje wszystkie możliwości Iteratora, jak już wcześniej pisałem.

Teraz jeszcze uświadomiłem sobie, że i metodę key() możemy symbolicznie wykorzystać, bo wskazuje ona numer aktualnego rekordu spośród wszystkich zwróconych.

Ten post edytował mortus 16.08.2011, 12:57:17
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: 6.10.2025 - 20:58