![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 6.04.2009 Skąd: Warszawa Ostrzeżenie: (10%) ![]() ![]() |
Witam,
Nie dawno zacząłem się uczyć obiektowego PHP. Mam pytanie: Czy mogę wywołać obiekt w obiekcie? Czy można to zrobić inaczej?
Powód edycji: [batman]:
|
|
|
![]() |
![]()
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.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 580 Pomógł: 85 Dołączył: 25.03.2010 Skąd: Skrzyszów :) Ostrzeżenie: (0%) ![]() ![]() |
Możesz przekazać referencje do klasy jako parametr |
|
|
![]()
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?
|
|
|
![]()
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
|
|
|
![]()
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:
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ć. |
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
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ć.
|
|
|
![]()
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 ![]() Wzorzec singleton Ten post edytował zend 31.03.2010, 21:50:13 |
|
|
![]()
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
|
|
|
![]()
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 |
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 09:03 |