Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa rejestru
Forum PHP.pl > Forum > PHP > Object-oriented programming
janusz.master
Witam

Od razu powiem ze być może jest to gdzieś w sieci w sieci opisane, ale nie znalazłem więc piszę.
Otóz mam klase rejestru. W głównym pliku wrzucam do niej instancję bazy danych.
W klasie user pobieram tą klasę z rejestru. Dodając uzytkownika klasa user korzysta ze skopiowanej bazy danych. Zatem jak mogę w taki sposób otrzymać ilość wszystkich zapytań do bazy?questionmark.gif

Kod wygląda przykładowo tak:
  1. <?php
  2. //kontroler:
  3.  
  4. $db = new database();
  5. Registry::add('db', $db);
  6. $user = new user();
  7. //...pomijamy pobieranie danych itp;
  8. $user->add();
  9.  
  10.  
  11. //...klasa user:
  12.  
  13. class user{
  14. ...
  15. function __construct(){
  16. $this->db = Registry::get('db');
  17. }
  18. ...
  19. function add(){
  20. //mamy juz dane;
  21. $this->db->insert($dane);
  22. }
  23. }
  24. ?>


No i teraz w pliku głównym wyswietlam np ilosc wykonanych zapytan.
Jak zrobić aby bazę pobierać i zmieniać jej oryginałquestionmark.gif?
Nie do końca rozumiem sposob uzywania rejestru wiec nie wiem jak go uzyc.
Czytalem kilka art'ów o rejestrze ale wszędzie było tylko o jego roli i podstawowych funkcjach.
Proszę o wyjaśnienie.
Nattfarinn
Cytat(janusz.master @ 23.01.2008, 20:45:45 ) *
No i teraz w pliku głównym wyswietlam np ilosc wykonanych zapytan.
Jak zrobić aby bazę pobierać i zmieniać jej oryginał questionmark.gif ?

Nie bardzo rozumiem, co chcesz powiedzieć przez oryginał/kopia bazy. Domyślam się, że chodzi Ci o objekt klasy bazy danych, o jego instancje. Wg. przykładu który podałeś, wszystko jest w porządku. Obiekt tworzysz tylko raz (... = new database();) a dalej operujesz tylko na jego uchwytach. Rejestr służy do przechowywania takich instancji w klasie statycznej i sprawuje nad nimi pewną kontrolę. Nie ma znaczenia czy operujesz na Registry::get('db'); czy bezpośrednio na $db, bo obie wartości są uchwytami tego samego obiektu. Więc, jeśli na końcu pliku dasz przykładowo Registry::get('db')->QueryCount(); czy $db->QueryCount(); wyświetli tą samą wartość, uwzględniającą wszystkie użycia obiektu klasy database, niezależnie gdzie i kiedy były używane.

Cytat(janusz.master @ 23.01.2008, 20:45:45 ) *
Nie do końca rozumiem sposob uzywania rejestru wiec nie wiem jak go uzyc.
Czytalem kilka art'ów o rejestrze ale wszędzie było tylko o jego roli i podstawowych funkcjach.
Proszę o wyjaśnienie.

Początkowo używanie rejestru może wydać sie niejasne, ale niewątpliwie ma wiele zalet (chociaż są opozycjoniści tego punktu widzenia). Przede wszystkim zapewnia pewną spójność, a nawet pokusiłbym sie o stwierdzenie: wygodę, pozwala sprawować pełną kontrolę na przepływem instancji czy operacje na nich. Podstawową funkcjonalnością jest możliwość dostępu do instancji danej klasy z dowolnego miejsca aplikacji (klasa statyczna) bez każdorazowego tworzenia nowych obiektów oraz bez użycia zmiennych globalnych (podoba funckjonalność). Tą funkcjonalność można rozszerzyć o wyżej wymienione rzeczy (kontrolę, operacje, wyjątki etc. - czego dusza zapragnie). Prosty, podstawowy sposób użycia:

Zamiast używania zmiennych globalnych (przykład poniższy):
  1. <?php
  2. $db = new database();
  3. ...
  4. class przyklad
  5. {
  6. public function funkcja()
  7. {
  8. global $db;
  9. $db->exeQuery(...);
  10. }
  11. }
  12. ?>


Użyjesz:
  1. <?php
  2. Registry::setObj("baza", new database());
  3. ...
  4. class przyklad
  5. {
  6. public function funkcja()
  7. {
  8. Registry::getObj("baza")->exeQuery(...);
  9. }
  10. }
  11. ?>


Pozostałych użyć opisywać nie będę, bo wychodzę z założenia że: "jeśli ich nie znasz to znaczy, że jeszcze ich nie potrzebowałeś". Przyjdzie samo z czasem smile.gif

Pozdrawiam!
Natt.
Sedziwoj
Cytat(Nattfarinn @ 24.01.2008, 09:40:16 ) *
Nie bardzo rozumiem, co chcesz powiedzieć przez oryginał/kopia bazy. Domyślam się, że chodzi Ci o objekt klasy bazy danych, o jego instancje. Wg. przykładu który podałeś, wszystko jest w porządku. Obiekt tworzysz tylko raz (... = new database();) a dalej operujesz tylko na jego uchwytach. Rejestr służy do przechowywania takich instancji w klasie statycznej i sprawuje nad nimi pewną kontrolę. Nie ma znaczenia czy operujesz na Registry::get('db'); czy bezpośrednio na $db, bo obie wartości są uchwytami tego samego obiektu. Więc, jeśli na końcu pliku dasz przykładowo Registry::get('db')->QueryCount(); czy $db->QueryCount(); wyświetli tą samą wartość, uwzględniającą wszystkie użycia obiektu klasy database, niezależnie gdzie i kiedy były używane.


Tu masz rację, ale musisz zaznaczyć, że to ma miejsce dopiero od PHP5. (bo niestety niektórzy nie zaznaczają na której wersji pracują, że to nie jest 5.x [choć x też czasem jest bardzo ważny])
janusz.master
Ok dzieki za odpowiedź. Po prostu myślałem że w klasie pracuję na kopii obiektu a nie na oryginale. To był mój problem winksmiley.jpg
Czyli działa to podobnie jak wskaźniki np w C.

W takim razie Pozdrawiam, temat do zamkniecia
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.