Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie obiektu w obiekcie
Forum PHP.pl > Forum > PHP > Object-oriented programming
impimp94
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. }
phpion
Tak, możesz tworzyć obiekty wewnątrz innych klas.
zend
  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
Frozen
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?
morgan
Dziedziczenie, jezeli dobrze zrozumialem co chciales powiedziec
Crozin
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ć.
mike
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ć.
zend
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
morgan
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 :]
Crozin
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.
zend
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
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.