Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Instancja połaczenia z baza
MeGusta
post 15.06.2017, 21:36:30
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 6.07.2015

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


Witam,
Tworzę aplikacje OOP PHP, napisałem klasę Database w której są metody od połaczenia, select, update itp.
Mam w aplikacji wiele innych klas takich jak, Site, User, Account itd, nie widzę sensu aby w każdej tworzyć w konstruktorze instancję klasy Database, moje pytanie to jak można zrobić aby w każdej z klas miec dostęp do metod z Database, extends do każdej z klas? Czy jest jakiś sensowniejszy pomysł aby to rozwiązać?

Ten post edytował MeGusta 15.06.2017, 21:36:58
Go to the top of the page
+Quote Post
viking
post 16.06.2017, 03:30:39
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Dependency injection


--------------------
Go to the top of the page
+Quote Post
bostaf
post 16.06.2017, 10:12:14
Post #3





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(MeGusta @ 15.06.2017, 22:36:30 ) *
extends do każdej z klas?

extends zdecydowanie nie, bo to by było nielogiczne. extends to rozszerzenie/rozbudowanie innej klasy. Ani User ani Account itd nie rozszerzają klasy Database, tylko ją wykorzystują/używają. User mógłby rozszerzać np. Person, gdzie Person miałby atrybuty "name" i "age", a User dodatkowo na przykład "email". Tak jak Samochód może rozszerzać Pojazd, albo Kotek rozszerzać Zwierzaka. Ale ani Samochód ani Kotek nie mogą rozszerzać SposobuPoruszaniaSie; mogą SposobPoruszaniaSie co najwyżej wykorzystywać. Od tego jest to co viking napisał - dependedncy injection.


Cytat(MeGusta @ 15.06.2017, 22:36:30 ) *
napisałem klasę Database w której są metody od połaczenia, select, update itp.
Mam w aplikacji wiele innych klas takich jak, Site, User, Account itd, nie widzę sensu aby w każdej tworzyć w konstruktorze instancję klasy Database

A właśnie że jest sens tongue.gif przekazywanie zależności konstruktorem to jedna z technik tego o czym viking napisał - dependency injection.

Generalnie, to klasa Database jest pośrednikiem między innymi klasami a fizycznym źródłem danych. Jeśli User, Site, Account itd. mają być pamiętane, to muszą być świadome źródła danych - czy to będzie Database, czy FileSystem, czy Session, czy cokolwiek. To tak jak Kotek żeby łazić po płocie musi być świadomy swoich kończyn (chociażby na poziomie podświadomości smile.gif) No to mu je uświadomimy z poziomu konstruktora. Ale nie uświadomimy tego samego aparatu ruchowego każdemu Zwierzakowi. Dlatego konstruktor będzie brał jako argument jakikolwiek SposobPoruszaniaSie, który KocieLapy będą rozszerzały.

Tylko że ta technika - konstruktorem, tak jakby stawia klasie wymóg istnienia _konkretnej_ zależności. Nic w tym złego. Ale jak pomyślisz "a co jeśli nie zawsze chciałbym wykorzystywać Database do operowania Userami? Albo brać ich nie z Database a z innego źródła?". I tutaj właśnie musiałbyś skorzystać z rozszerzania (zrobić generalny opis źródła danych, który Twoja Database by rozszerzała) albo interfejsu z setterem, który wymuszałby zdefiniowanie źródła danych dla wybranych klas:
  1. interface UstawiaczZrodloDanych
  2. {
  3. public setZrodloDanych();
  4. }
  5.  
  6. class User implements UstawiaczZrodlaDanych {}
  7. class Account implements UstawiaczZrodlaDanych {}
  8. // ale Site nie musi:
  9. class Site {}


Tak czy inaczej, to wszystko to przekazywanie zależności i to ma sens bo jeśli chcesz żeby klasa brała informacje z bazy, to musi o tym wiedzieć i trzeba jej to za każdym razem powiedzieć.
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: 19.07.2025 - 03:12