Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wywołanie obiektu w obiekcie
impimp94
post 29.03.2010, 07:09:10
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 6.04.2009
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Witam,
Nie dawno zacząłem się uczyć obiektowego PHP. Mam pytanie: Czy mogę wywołać obiekt w obiekcie? Czy można to zrobić inaczej?
  1. // Uproszczona wersja klasy
  2. class MySql {
  3. public $login;
  4. public $pass;
  5. public $server;
  6. public $db_name;
  7. function MySql($server,$login,$pass,$db_name) {
  8. $conn = mysql_connect($this->server,$this->login,$this->pass);
  9. mysql_select_db($this->db_name);
  10. }
  11. function query($sql) {
  12. $query = mysql_query($sql);
  13. }
  14. }
  15.  
  16. class jakas {
  17. // jakieś zmienne
  18. function chec_login($login,$pass) {
  19. $conn = new Mysql(); //dane
  20. // Nie wiem czy tak powinno się robić
  21. // Bardzo proszę o pomoc
  22. // i z góry dziękuje
  23. }
  24. }
Powód edycji: [batman]:
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
phpion
post 29.03.2010, 07:11:30
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Tak, możesz tworzyć obiekty wewnątrz innych klas.
Go to the top of the page
+Quote Post
zend
post 29.03.2010, 14:31:10
Post #3





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


  1. class jakas {
  2. // jakieś zmienne
  3. function chec_login($login,$pass , $conn) {
  4. // Nie wiem czy tak powinno się robić
  5. // Bardzo proszę o pomoc
  6. // i z góry dziękuje
  7. }
  8. }
  9.  
  10. $m = new Mysql();
  11. $j = new jakas();
  12. $j -> check_login($l , $h , $m);
Możesz przekazać referencje do klasy jako parametr
Go to the top of the page
+Quote Post
Frozen
post 31.03.2010, 16:15:43
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.04.2006

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


Mam takie pytanie dotyczące dokładnie tej kwestii. Jak z tym sobie poradzić gdy mamy klasy korzystające z klasy obsługi abstrakcji bazy danych. Czy w każdej stworzyć na nowo obiekt klasy db, czy są jakieś programistyczne praktyki, które pozwalają "obejść" ten problem?
Go to the top of the page
+Quote Post
morgan
post 31.03.2010, 16:36:48
Post #5





Grupa: Zarejestrowani
Postów: 37
Pomógł: 6
Dołączył: 22.10.2007
Skąd: /dev/null

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


Dziedziczenie, jezeli dobrze zrozumialem co chciales powiedziec

Ten post edytował morgan 31.03.2010, 16:42:40


--------------------
Zobacz i pośmiej sie na ifixed.it
Go to the top of the page
+Quote Post
Crozin
post 31.03.2010, 19:33:15
Post #6





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

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


Przekazujesz obiekt "bazy danych" do każdego z tych obiektów:

  1. class MyDBHandler { ... }
  2.  
  3. class A {
  4. private $db;
  5.  
  6. public function __construct(MyDBHandler $db) {
  7. $this->db = $db;
  8. }
  9. }
  10.  
  11. class B {
  12. private $db;
  13.  
  14. public function setDbHandler(MyDBHandler $db) {
  15. $this->db = $db;
  16. }
  17. }
  18.  
  19. $db = new MyDBHandler();
  20. $a = new A($db);
  21. $b = new B();
  22. $b->setDBHandler($db);
W zależności od potrzeb stosujesz wersję A lub B. W tym konkretnym przypadku, będzie to zapewne A. Oczywiście obie wersje można połączyć.
Go to the top of the page
+Quote Post
mike
post 31.03.2010, 20:10:24
Post #7





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

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


Cytat(morgan @ 31.03.2010, 17:36:48 ) *
Dziedziczenie, jezeli dobrze zrozumialem co chciales powiedziec
Omijaj dziedziczenie w takich momentach. Jeśli chcesz mieć dostęp do bazy danych w wielu klasach to odziedziczenie po jakiejś klasie DB (powiedzmy, że to wsparcie dla bazy danych) jest najgorszym co możesz zrobić.
Go to the top of the page
+Quote Post
zend
post 31.03.2010, 21:47:43
Post #8





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


W prostych przypadkach, takich jak Twój, najlepszym rozwiązaniem co do bazy danych jest singleton, czyli klasa którą tworzy się tylko raz w czasie wywołania całego skryptu np $db = MyDatabase::getInstance(); w tej klasie w metodzie __construct() tworzysz połączenie i przypisujesz do pola, implementujesz tez taką metodę jak query() która wykonuje zapytania, opcjonalnie mozesz dodać jeszcze kilka metod takich jak insert(), update(), delete(), select(), które przyspieszą tworzenie kodu

Implementacja obslugi bazy danych jako singleton uwolni Cię od ciągłej potrzeby przekazywania połączenia do klas jako parametr konstruktora, jest też kilka minusów używania singletona, ale to chyba nie temat na ten wątek smile.gif

Wzorzec singleton

Ten post edytował zend 31.03.2010, 21:50:13
Go to the top of the page
+Quote Post
morgan
post 31.03.2010, 21:51:38
Post #9





Grupa: Zarejestrowani
Postów: 37
Pomógł: 6
Dołączył: 22.10.2007
Skąd: /dev/null

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


no jak widac nie zrozumialem, racja dziedziczenie bedzie tutaj najgorszym ze sposobów. To co zaprezentowal Crozin nazywa sie kompozycją. .Ja zazwyczaj stosuje w takim przypadku wzorzec singletona. Zazwyczaj otwieramy tylko jedno polaczenie z baza danych, wiec wystarczy jedna instancja danej klasy i dzieki uzyciu kompozycji mozesz trzymac referencje do tej instacji w kazdej klasie.
Przepraszam jezeli wprowadzilem wczesniej w blad.

O zostalem uprzedzony :]

Ten post edytował morgan 31.03.2010, 21:52:58


--------------------
Zobacz i pośmiej sie na ifixed.it
Go to the top of the page
+Quote Post
Crozin
post 31.03.2010, 22:45:04
Post #10





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

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


Cytat
W prostych przypadkach, takich jak Twój, najlepszym rozwiązaniem co do bazy danych jest singleton
Wcale, że nie będzie. Singleton powinien być używany tylko i wyłącznie w celu zapewnienia, że powstanie dokładnie jedna instancja klasy, a nie w celu dostępu do niej zewsząd.

Klasa mająca obsługiwać bazę danych nie jest czymś co kwalifikuje się pod użycie Singletona.

Ten post edytował Crozin 31.03.2010, 22:45:15
Go to the top of the page
+Quote Post
zend
post 1.04.2010, 10:53:01
Post #11





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


Dostęp do bazy danych z każdego miejsca jest tą nieprzyjemną konsekwencją nad którą nie chciałem się rozwodzić. Singleton jest strukturą którą najłatwiej utrzymać na samym początku zwłaszcza gdy osoba kodująca jest świerza w temacie i nie wie w co ręce włożyć.

Kolejną lepszą praktyką może być dziedziczenie wszystkich modeli (miejsc z których będziesz wykonywał zapytania), w klasie bazowej tworzysz publiczny statyczny setter przez który ustawiasz połączenie i chroniony statyczny getter przez który możesz wyciągnąć połączenie które uprzednio ustawiłeś, w klasach w których dziedziczysz tą klasę masz bezproblemowy dostep do bazy i nie ma nieprzyjemnych konsekwencji użycia singletona który użyty w niewłaściwy sposób jest antywzorcem projektowym

Ale sam wybierz co bedzie na samym początku lepsze dla Ciebie

Ten post edytował zend 1.04.2010, 10:53:36
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: 14.08.2025 - 09:03