Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Połączenie z BD ( Singleton ) - Problem
Forum PHP.pl > Forum > PHP
ziomek32
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:)
wookieb
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.  
ziomek32
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
wookieb
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.
ziomek32
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?
wookieb
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.
ziomek32
Tak, wiem dlatego zdecydowałem się zastosować singleton, czyli to rozwiązanie jest dobre?
wookieb
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)
Crozin
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.
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.