Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Połączenie z BD ( Singleton ) - Problem
ziomek32
post 30.06.2010, 13:52:41
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 21.09.2009

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


Witam wszystkich bardzo serdecznie:)

Mam o to taki kod:
  1. final class DB
  2. {
  3.  
  4. private static $pdo = false;
  5.  
  6.  
  7. public static function pdo()
  8. {
  9. if( self::$pdo == false )
  10. {
  11. self::$pdo = new PDO('mysql:host=localhost;dbname=baza', 'user', 'haslo');
  12. }
  13. return self::$pdo;
  14. }
  15.  
  16. private function __construct() {
  17.  
  18. }
  19. }
  20.  
  21. $db = DB::pdo();
  22.  
  23. $a = $db->query("select pole from tabela");
  24.  
  25. while($b = $a->fetch(PDO::FETCH_OBJ)){
  26.  
  27. echo $b->pole.'<br />';
  28.  
  29. }
  30.  
  31. class test {
  32.  
  33. public function t(){
  34.  
  35. $a = $db->query("select pole from tabela");
  36.  
  37. while($b = $a->fetch(PDO::FETCH_OBJ)){
  38.  
  39. echo $b->pole;
  40.  
  41. }
  42.  
  43. }
  44.  
  45. }
  46.  
  47. $c = new test();
  48. $c->t();


Chciałbym zrobić tak aby wywołanie połączenie z baza danych działało przez $db w klasie test, jak narazie działa mi to tylko poza klasą czy mógłby mi ktoś pomóc rozwiązać mój problem?

Pozdrawiam z góry dzięki za odp:)
Go to the top of the page
+Quote Post
wookieb
post 30.06.2010, 13:56:03
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Podstawy...
  1. $db = DB::pdo();
  2. $a = $db->query("select pole from tabela");
  3.  
  4. while($b = $a->fetch(PDO::FETCH_OBJ)){
  5.  
  6. echo $b->pole;
  7.  
  8.  


--------------------
Go to the top of the page
+Quote Post
ziomek32
post 30.06.2010, 14:04:00
Post #3





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 21.09.2009

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


Tzn? gdzie zrobiłem błąd? Przepraszam że zadaje takie pytania ale dopiero zaczynam z OOP, byłbym wdzięczny gdyby mi ktoś dokładniej wytłumaczył co jest nie tak smile.gif
Go to the top of the page
+Quote Post
wookieb
post 30.06.2010, 14:06:49
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Brakowało CI
  1. $db = DB::pdo();

Na początku twojej metody test()
A problem wynika z zasięgu zmiennych. Metoda nie widzi zmiennych zdefiniowanych poza nią bądź nie będących właściwościami klasy w jakiej się znajduje.


--------------------
Go to the top of the page
+Quote Post
ziomek32
post 30.06.2010, 14:09:56
Post #5





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 21.09.2009

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


Aha, to ja do każdej metody muszę teraz dodawać $db = DB::pdo(); aby mi nawiązało połączenie z DB, nie da się tego jakoś "obejść" bo to chyba nie jest najbardziej optymalne rozwiązanie?
Go to the top of the page
+Quote Post
wookieb
post 30.06.2010, 14:11:18
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Singleton w twoim wypadku nie nawiązuje za każdym razem połączenie tylko zwraca ci obiekt, które to połączenie nawiązało. Tak więc bez względu jak wiele wywołań DB::pdo dasz to i tak będzie wykorzystane i nawiązane jedno połączenie.


--------------------
Go to the top of the page
+Quote Post
ziomek32
post 30.06.2010, 14:12:56
Post #7





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 21.09.2009

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


Tak, wiem dlatego zdecydowałem się zastosować singleton, czyli to rozwiązanie jest dobre?
Go to the top of the page
+Quote Post
wookieb
post 30.06.2010, 14:14:50
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie singleton nie jest dobrym rozwiązaniem aczkolwiek bardzo wygodnym. Naj naj lepszym rozwiązaniem jest zastosowanie wzorca Context natomiast wygodniejszym i najczęściej stosowanym jest Registry albo Factory. Musisz o nich poczytać (materiałów jest sporo aczkolwiek nie mam pewności co do Contextu)


--------------------
Go to the top of the page
+Quote Post
Crozin
post 30.06.2010, 14:26:33
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
aczkolwiek bardzo wygodnym
Jedynie pozornie, ponieważ korzystanie tego w taki sposób jak pokazany tutaj w postach sprawia, że można się pochlastać później (debuggowanie, modelowanie relacji pomiędzy obiektami).
Cytat
Naj naj lepszym rozwiązaniem jest zastosowanie wzorca Context
To zabrzmiało jak jakaś prawda absolutna. winksmiley.jpg Kontekst rzeczywiście byłby w tej sytuacji lepszym rozwiązaniem - ale czy najlepszym? Niekoniecznie - zależy od sytuacji.

Tak się "czepiam" tylko winksmiley.jpg

Co do Singletona samego w sobie - chciałem zaznaczyć, że ideą tego wzorca jest zapewnienie tylko jednej (dwie lub więcej mogłyby zaszkodzić aplikacji - połączenie z bazą danych nie jest taką klasą) instancji danej klasy, a nie globalny dostęp do takowej. Co więcej tutaj Singleton jest źle zaimplemetowany - nadal można klonować obiekt.

Ten post edytował Crozin 30.06.2010, 14:38:00
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 05:21