Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [OOP] Dołączenie sterownika bazy do aplikacji.
MagnuM
post
Post #1





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

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


Witam,
postaram się jak najlepieej opisać problem.

Aplikacja opiera się o programowanie obiektowe.

Mam napisany sterownik bazy danych m.in. zawierający obliczanie ilości wykonanych zapytań do bazy.
Oprócz tej klasy istnieje klasa obsługująca użytkownika - zalogowanego, bądź nie.

Problem wydaje się banalny, ale nie dla mnie. Chciałbym aby sterownik obsługujący np. obliczanie ilości zapytań potrzebnych do wyświetlenia newsów na stronie (taki przykład) był również wykorzystywany w tej samej formie (ten sam identyfikator) do obliczania ilości zapytań podczas obsługi użytkownika, aby ilość zapytań była dodawana.

Tj. na początku skryptu znajduje się kod: $sql = new Mysql( [parametry] ); Aby użyć klasy bazy danych w klasie np. User musiałem tworzyć nowy identyfikator, albo zastąpić już istniejący. Aby temu zapobiec wykorzystywałem do tego konstrukcję global, ale już wiem, że to nie jest poprawne.

Jest na to jakieś rozwiązanie?
Pozdrawiam.
Go to the top of the page
+Quote Post
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Najlepiej przekazać obiekt jako argument przy tworzeniu obiektu odpowiedzialnego za obsługę użytkownika.

  1. <?php
  2. $db = new DBClass('...');
  3. $user_manager = new UserManager($db);
  4. ?>


Zachowujesz referencję do tego obiektu jako atrybut klasy i przy wywołaniu każdej metody masz zawsze dostępny z wewnątrz obiektu.
Go to the top of the page
+Quote Post
NuLL
post
Post #3





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


To nie lepiej Singleton (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Ludvik
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Singleton narzuca implementację sterownika. Chociaż nie ukrywam, że czasami jest wygodny.
Go to the top of the page
+Quote Post
MagnuM
post
Post #5





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

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


Postanowiłem bliżej przyjrzeć się temu nieszczęsnemu zjawisku singletona.

Przeczytałem artyuł na stronie: http://webcity.pl/webcity/artykuly.php/t/62 i zastanawia mnie pewna rzecz.

Chciałbym wywoływać klasę w następujący sposób: $sql = new Mysql( [parametry] );,a później w innych klasach tworzyć singleton z referencją do tego egzemplarza.
Problem w tym, że kiedy chcem wywołać następujący singleton:
  1. <?php
  2. public function getInstance()
  3.  {
  4.  static $instance;
  5.  
  6.  if ( !isset( $instance ) )
  7.  {
  8.  $instance = new Mysql;
  9.  }
  10.  return $instance;
  11.  }
  12. ?>

.. w innej klasie to tworzony jest nowy egzemplarz klasy na miejscu tamtego i niestety nie rozwiązuje to problemu.

Zaciekawiło mnie ostatnie zdanie w podanym wyżej artykule: "Spróbujcie napisać funkcję, która będzie przyjmować nazwę klasy, a zwracać referencję do obiektu stworzonego za pomocą singletonu.". Czy to aby nie rozwiązało by tego problemu ? Jak to napisać?

Pozdrawiam
Go to the top of the page
+Quote Post
Ludvik
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


To nie tak działa. Po pierwsze instancję trzymamy w prywatnej statycznej zmiennej klasy, a nie funkcji. Po drugie, instancji nigdy się nie tworzy operatorem new, bo konstruktor ma być chroniony/prywatny. Zawsze należy użyć funkcji getInstance, która ma dostęp do konstruktora z wewnątrz obiektu. Konstruktor w przypadku klasy bazy danych jest niewygodny, bo obiekty są konstruowane na podstawie kilku argumentów.
Go to the top of the page
+Quote Post
MagnuM
post
Post #7





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

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


Ok. Przedstawię co udało mi się wykombinować. Niby działa, ale...

Konstruktor sterownika bazy zajmuje się połączeniem i prywatny.

Singleton (martwi mnie to przekazywanie parametrów tutaj). [$oInstance jest private static]
  1. <?php
  2. public static function getInstance( $sHost = false, $sUser = false, $sPass = false, $sName = false, $p = false )
  3. {
  4. if ( self::$oInstance == null )
  5. {
  6. self::$oInstance = new Mysql( $sHost, $sUser, $sPass, $sName, $p );
  7. }
  8. return self::$oInstance;
  9. }
  10. ?>


I teraz wygląda to tak, że w wywołaniu klasy (tu gdzie teraz byłoby wywołanie do konstruktora gdyby nie singleton, są przekazywane parametry - dlatego są opcjonalne) - czyli: $sql = Mysql::getInstance( [parametry] );
A w reszcie kodu: $sql = Mysql::getInstance();

Jednak wiem, że przekazywanie parametrów do singletona mija się z jego ideą. Powinienem więc zamiast konstruktora napisać funkcję do łączenia z bazą i wywoływać objekt klasy na kształt:
  1. <?php
  2. $sql = Mysql::getInstance();
  3. $sql = Mysql::connect();
  4. ?>

Albo na odwrót ? Wyczytałem to gdzieś i nie zabardzo wiem jak to działa w tym przypadku.

Prosiłbym o dogłębsze wytłumaczenie sprawy, może komuś się przyda, a ja chciałbym wiedzieć co i jak jest zalecane żeby pisać poprawnie.

Pozdrawiam.
Go to the top of the page
+Quote Post
bigZbig
post
Post #8





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Polecam wzorzec Property, z którego korzysta min. Zend_Framework w swoim rejestratorze obiektow (Zend::register())

Ten post edytował bigZbig 27.07.2006, 14:54:11
Go to the top of the page
+Quote Post
MagnuM
post
Post #9





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

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


Cytat(bigZbig @ 27.07.2006, 15:53 ) *
Polecam wzorzec Property, z którego korzysta min. Zend_Framework w swoim rejestratorze obiektow (Zend::register())


Heh... niezłe. Czyli mówisz, że Zend używa tego zamiast wzorcu singletona? To chyba rzeczywiście mniej zachodu...
Go to the top of the page
+Quote Post
bigZbig
post
Post #10





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Pofatygowalem sie i napisalem maly artykul na ten temat: Co zamiast global i GLOBALS - wzorzec Registry (Property).
Go to the top of the page
+Quote Post
Jim
post
Post #11





Grupa: Zarejestrowani
Postów: 111
Pomógł: 0
Dołączył: 27.07.2005

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


Cytat(MagnuM @ 27.07.2006, 15:32 ) *
Jednak wiem, że przekazywanie parametrów do singletona mija się z jego ideą. Powinienem więc zamiast konstruktora napisać funkcję do łączenia z bazą i wywoływać objekt klasy na kształt:
  1. <?php
  2. $sql = Mysql::getInstance();
  3. $sql = Mysql::connect();
  4. ?>

Albo na odwrót ? Wyczytałem to gdzieś i nie zabardzo wiem jak to działa w tym przypadku.

Prosiłbym o dogłębsze wytłumaczenie sprawy, może komuś się przyda, a ja chciałbym wiedzieć co i jak jest zalecane żeby pisać poprawnie.


nie widzę problemu w przekazywaniu zmiennych do getInstance(). Np. na początku skryptu robisz
  1. <?php
  2. $sql = Mysql::getInstance( $sHost , $sUser , $sPass , $sName , $p );
  3. ?>

a później już tylko getInstance bez parametrów.
Go to the top of the page
+Quote Post
NuLL
post
Post #12





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat
Pofatygowalem sie i napisalem maly artykul na ten temat: Co zamiast global i GLOBALS - wzorzec Registry (Property).

A po co to komu - pozatym ze w dobrych edytorach nagle mozna sobie tagi PHPDoc o kant ..... potluc ? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Singleton i Registry i nie maja ze soba nic wspolnego IMHM - bo nawet majac ten rejestr czy co tam moge sobie stworzyc instancje danej klasy.

Ten post edytował NuLL 29.07.2006, 20:46:20
Go to the top of the page
+Quote Post
bigZbig
post
Post #13





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Cytat(NuLL @ 29.07.2006, 21:44 ) *
A po co to komu - pozatym ze w dobrych edytorach nagle mozna sobie tagi PHPDoc o kant ..... potluc ? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ale o co chodzi?

Cytat(NuLL @ 29.07.2006, 21:44 ) *
Singleton i Registry i nie maja ze soba nic wspolnego IMHM - bo nawet majac ten rejestr czy co tam moge sobie stworzyc instancje danej klasy.

Jesli Rejestr jest obiektem a nie klasa z wlasciwosciami i metodami statycznymi to dobrze aby w aplikacji byl tylko jeden rejestr - i stad uzycie Singletona. A w rejestrze trzymasz co chcesz nie tylko obiekty klas typu singleton.
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: 5.01.2026 - 05:35