Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Połączenie z BD ( Singleton ) - Problem
ziomek32
post
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
 
Start new topic
Odpowiedzi (1 - 8)
wookieb
post
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
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
wookieb
post
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
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
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
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
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
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. (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:54