Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jedna deklaracja 1 klasy dla wszystkich innych, mysql dla wszystkich klas
Spawnm
post 17.02.2009, 13:22:43
Post #1





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Witam,

mam klasy mysql,session,panel
wszystkie są deklarowane w pliku index.php

$db=new mysql($dbhost,$dbuser,$dbpass,$dbname);
$session=new session();
itp...

i teraz pytanie :
co zrobić aby mysql był dostępny w innych klasach bez ponownej deklaracji / łączenia?
Go to the top of the page
+Quote Post
nospor
post 17.02.2009, 13:32:36
Post #2





Grupa: Moderatorzy
Postów: 34 777
Pomógł: 5783
Dołączył: 27.12.2004




skorzystac ze wzorcow projektowych, np:
Rejestr
od biedy Singleton


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mls
post 26.03.2009, 00:55:17
Post #3





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


To już zależy tylko od metody jaką utworzony zostanie inny obiekt. Jeśli kolejny obiekt będzie rozszerzeniem obecnego (deklarującego połączenie z bazą danych) to nie trzeba robić nic, by w klasach-dzieciach zmienna istniała (chyba, że będzie to zmienna typu private). Zarówno do singletona jak i rejestru trzeba się w każdej klasie w jakiś sposób odwoływać.


--------------------
Go to the top of the page
+Quote Post
Morkai
post 26.03.2009, 12:49:45
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 25.08.2005

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


Cytat(mls @ 26.03.2009, 00:55:17 ) *
to nie trzeba robić nic

Trzeba zadeklarować zmienną jako statyczną. Najgorsze rozwiązanie z możliwych.

Jak chcesz wykorzystać inny obiekt to po prostu go przekazujesz, nie?

$db=new mysql($dbhost,$dbuser,$dbpass,$dbname);
$session=new session($mysql);
itp...
Go to the top of the page
+Quote Post
zzeus
post 26.03.2009, 14:15:47
Post #5





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Polecam wzorzec Registry, o którem już wspomniano wcześniej.
Przykład Zend_Registry


--------------------
Go to the top of the page
+Quote Post
Spawnm
post 26.03.2009, 14:44:34
Post #6





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Cytat(Morkai @ 26.03.2009, 12:49:45 ) *
Trzeba zadeklarować zmienną jako statyczną. Najgorsze rozwiązanie z możliwych.

Jak chcesz wykorzystać inny obiekt to po prostu go przekazujesz, nie?

$db=new mysql($dbhost,$dbuser,$dbpass,$dbname);
$session=new session($mysql);
itp...


chyba nie
  1. <?php
  2. $db=new mysql($dbhost,$dbuser,$dbpass,$dbname);
  3. $session=new session($mysql);
  4. ?>

tylko
  1. <?php
  2. $db=new mysql($dbhost,$dbuser,$dbpass,$dbname);
  3. $session=new session($db);
  4. ?>

smile.gif
Robiłem tak , ale to jest dobre do małych stron z 1-2 klasami , w większych projektach jest to już trochę słabe rozwiązanie...
Go to the top of the page
+Quote Post
Fifi209
post 26.03.2009, 16:55:17
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Racja bardzo słabe. Ja rozwiązałem ten problem przy swoim projekcie w sposób prosty. Klasa mysql jest u mnie klasą w pełni statyczną. Nie posiada więc konstruktora ani destruktora, za to działa wszystko ładnie. ;d


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
starach
post 26.03.2009, 18:02:05
Post #8





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Cytat(fifi209 @ 26.03.2009, 16:55:17 ) *
Racja bardzo słabe. Ja rozwiązałem ten problem przy swoim projekcie w sposób prosty. Klasa mysql jest u mnie klasą w pełni statyczną. Nie posiada więc konstruktora ani destruktora, za to działa wszystko ładnie. ;d
Robienie sterowników dostępu do danych na obiektach statycznych to masochizm. Zobacz sobie jaka fajna wariacja singletona ( chociaż możliwe że ma to własną nazwę ) jest w ORM o nazwie Doctrine. Wracając do tematu. Pisząc własny framework testowałem bardzo dużo sposobów przekazywania danych. forum.php.pl nawróciło mnie na wzorzec projektowy Context chociaż Registry też ma kilka zalet. Proponowałbym ci dogłębne zbadanie obu wzorców i wybranie tego który najlepiej tobie odpowiada.
Go to the top of the page
+Quote Post
Fifi209
post 26.03.2009, 18:24:27
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(orglee @ 26.03.2009, 18:02:05 ) *
Robienie sterowników dostępu do danych na obiektach statycznych to masochizm. Zobacz sobie jaka fajna wariacja singletona ( chociaż możliwe że ma to własną nazwę ) jest w ORM o nazwie Doctrine. Wracając do tematu. Pisząc własny framework testowałem bardzo dużo sposobów przekazywania danych. forum.php.pl nawróciło mnie na wzorzec projektowy Context chociaż Registry też ma kilka zalet. Proponowałbym ci dogłębne zbadanie obu wzorców i wybranie tego który najlepiej tobie odpowiada.


Masochizm ? Czemu tak uważasz ?
Ja porobiłem takie metody aby było mi jak najbardziej wygodnie, przed wykonaniem jakiejkolwiek metody czy to select czy update sprawdzam czy mam połączenie z mysql, jeżeli nie to rzucam wyjątkiem. ;p


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
starach
post 26.03.2009, 18:55:39
Post #10





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


To pokaż chociaż prototypy metod.
Go to the top of the page
+Quote Post
Fifi209
post 26.03.2009, 19:04:26
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


http://rafb.net/p/qkKxdy33.html

Musiałem dać na rafb bo nie było tutaj wcięć.

(stara wersja mojej klasy, gdzieś wydłubałem. Uuu tak patrzę na to nawet wyjątków nie rzucałem i te metody prawie nie rozbudowane)


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
starach
post 26.03.2009, 20:39:14
Post #12





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Przede wszystkim nie obsłużysz w ten sposób dwóch rożnych baz albo tej samej z różnymi uprawnieniami. Następnie zwracasz select z tablicy asocjacyjnej. Dobre to było przy PHP 4. No i głównym zarzutem jest to że w każdej metodzie musisz sprawdzać czy masz połączenie. To jest po prostu nie do zaakceptowania.

Spawnm odpowiem tutaj.
http://www.symfony-project.org/api/1_2/sfContext
Go to the top of the page
+Quote Post
Fifi209
post 27.03.2009, 12:34:33
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(orglee @ 26.03.2009, 20:39:14 ) *
Przede wszystkim nie obsłużysz w ten sposób dwóch rożnych baz albo tej samej z różnymi uprawnieniami. Następnie zwracasz select z tablicy asocjacyjnej. Dobre to było przy PHP 4. No i głównym zarzutem jest to że w każdej metodzie musisz sprawdzać czy masz połączenie. To jest po prostu nie do zaakceptowania.

Spawnm odpowiem tutaj.
http://www.symfony-project.org/api/1_2/sfContext


Jakbym się uparł to może i bym obsłużył 10 baz. Lecz nie jest mi to potrzebne. Korzystam z mysql, czasem z musu z postgresql.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
mls
post 29.03.2009, 13:06:39
Post #14





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


Cytat(Morkai @ 26.03.2009, 13:49:45 ) *
Trzeba zadeklarować zmienną jako statyczną. Najgorsze rozwiązanie z możliwych.

Jak chcesz wykorzystać inny obiekt to po prostu go przekazujesz, nie?


No chyba nie do końca zrozumiałeś moją wypowiedź. Miałem na myśli coś takiego:
  1. <?php
  2. class test1
  3. {
  4.    protected $db;
  5.  
  6.    public function __construct ()
  7.    {
  8.        $this->db = new pdo(...); // czy cokolwiek innego do bazy danych
  9.    }
  10. }
  11.  
  12. class test2 extends test1
  13. {
  14.    public function test()
  15.    {
  16.        print_r($this->db);
  17.    }
  18. }
  19.  
  20. $test = new test2();
  21. $test2->test();
  22. ?>


--------------------
Go to the top of the page
+Quote Post
Morkai
post 30.03.2009, 22:45:38
Post #15





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 25.08.2005

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


Cytat(fifi209 @ 26.03.2009, 15:55:17 ) *
Racja bardzo słabe.

Oczywiście nikt w świecie PHP nie słyszał o dependency injection.
Go to the top of the page
+Quote Post
mike
post 31.03.2009, 12:57:18
Post #16





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Morkai @ 30.03.2009, 23:45:38 ) *
Oczywiście nikt w świecie PHP nie słyszał o dependency injection.
Nie wymagaj zbyt wiele biggrin.gif
Springa nie zbudujesz w PHP, ale uważaj bo zdziwić się możesz: Lion PHP Framework (IoC based PHP framework).
Go to the top of the page
+Quote Post
destroyerr
post 31.03.2009, 13:52:57
Post #17





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Oczywiście, że ktoś słyszał o di w php. Na przykład tak jak mike podał wyżej, jest też kilka projektów di w php (Crafty, PicoContainer i jeszcze jakiś). Zend Framework ma gdzieś w wersji rozwojowej (czy jak to tam jest) Zend_Di.
No i najważniejsze, Symfony w wersji 2 też będzie mieć, choć na chwilę obecną już jest tworzony, tylko jako osobny komponent. Więcej informacji, jest tam też link do prywatnego bloga, gdzie DI jest opisywany, więc polecam zapoznać się z tymi materiałami.
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: 12.11.2019 - 06:26