Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> baza danych koncepcja obiektowa
collecter
post 20.04.2011, 21:17:38
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.10.2010

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


Poniewaz dopiero od niedawna mam stycznosc z objektowym projektowaniem w php, mam jedno pytanie ktore przysparza mie sporo trudnosci. Dotyczy ono polaczenia z baza danych i pozniejszego jego wykorzystywania. Zalozmy ze mamy kilka klas korzystajacych z bazy danych. Czy w waszych aplikacjach na poczatku pliku tworzycie polaczenie ( za pomoca funkcji mysql connect ) i dolaczacie ten plik do kazdej strony, a w waszych klasach zakladacie ze polaczenie zostalo juz wczesniej otwarte i uzywacie komend mysql query a na koncu strony zalozmy w pliku footer.php zamykacie polaczenie? Czy moze tworzycie klase mysql z komendami query itd. I kazda klasa korzysta z jej instancji i metod.

Chcac dac przyklad zeby to lepiej zobrazowac zalozmy ze mam klase User i metode setName. Czy w metodzie setName uzywacie bezposrednio komendy mysql update liczac ze polaczenie zostalo otwarte wczesniej (nie w tej klasie, a dolaczone w pliku do kazdej strony) czy moze w tej metodzie tworzycie instancje klasy MYSQL (stworzonej przeze mnie i np laczycie sie z baza w konstruktorze) i korzystacie z jej metod zeby wykonac operacje na bazie danych.

Mam nadzieje ze nie zagmatwalem tego za bardzo.
Go to the top of the page
+Quote Post
Crozin
post 20.04.2011, 21:25:23
Post #2





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

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


1. Od połączenia z bazą danych w PHP masz PDO, a nie mysql_connect.
2. Stan globalny (funkcje mysql_*() na nim operują) jest nienaturalny dla programowania obiektowego. Za każdym razem, gdy zaczynasz korzystać z czegoś globalnego można śmiało powiedzieć, że na 99% masz coś zrypanego.
3. Google: oop dependency injection
Go to the top of the page
+Quote Post
pyro
post 20.04.2011, 22:39:59
Post #3





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(Crozin @ 20.04.2011, 22:25:23 ) *
1. Od połączenia z bazą danych w PHP masz PDO, a nie mysql_connect.


Nigdy nie widziałem wiarygodnego wpisu, który by mówił o tym, że to PDO jest zwierzchnikiem połączeń z MySQL. Równie dobrze można użyć MySQLi, które nawet lepiej się sprawdzi w połączeniach z MySQL. (jest szybszy).

@collecter, połączeń z bazą danych powinno być jak najmniej. Jeśli to możliwe to najlepiej tylko jedno, które jak sam powiedziałeś może być w innym pliku, a ten plik może być potem dołączany do skryptu. Jakbyś pooglądał strukturę plików niektórych systemów opartych na PHP to byś zobaczył nieraz plik a'la db.php / conn.php / config.php, który najczęściej właśnie odpowiada za połączenie z bazą danych.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Crozin
post 20.04.2011, 23:06:08
Post #4





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

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


Cytat
Nigdy nie widziałem wiarygodnego wpisu, który by mówił o tym, że to PDO jest zwierzchnikiem połączeń z MySQL. Równie dobrze można użyć MySQLi, które nawet lepiej się sprawdzi w połączeniach z MySQL. (jest szybszy).
Nie napisałem, że nie może użyć niczego poza PDO. Nie mniej jednak to właśnie PDO jest standardem i to ono jest obsługiwane przez znakomitą większość zewnętrznych bibliotek (nawet tych stricte nastawionych na MySQL).
Go to the top of the page
+Quote Post
smentek
post 22.04.2011, 10:56:52
Post #5





Grupa: Zarejestrowani
Postów: 130
Pomógł: 11
Dołączył: 7.04.2003

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


Jakąkolwiek warstwę abstrakcji wybierzesz (PDO jest bardziej nowoczesne) ważne jest aby dostęp do niej następował przez obiektowy interfejs, oraz aby nie inicjalizować połączenia cześciej niż to konieczne, a także nie tworzyć nadmiarowych instancji obiektu obsługującego połączenie.

Najprostsze rozwiązanie (nie znaczy najlepsze): Opakowujesz obiekt z połączeniem do bazy w singleton, (tylko jedna instancja) tak że siedzi on sobie jako zmienna w nowo utworzonej klasie. W konstruktorze lub w którejś metod wywoływanych w konstruktorze ustawiasz połączenie którego używasz później. W ten sposób możesz go wyciągnąć w dowolnym miejscu w swoim systemie.

Oczywiście twój obiekt nie powinien powielać całego interfejsu PDO. Służy jedynie inicjalizacji połączenia, wszystkie metody są wywoływane na właściwym obiekcie z ustawionym połączeniem.

Tą samą funkcjonalność można osiągnąć bez singletonu, ale jest to już trudniejsze do osiągnięcia, ponieważ wymaga przekazywania obiektu jako zmiennej do miejsc w których będzie wykorzystywany.


--------------------
.:SMENTEK:.
Go to the top of the page
+Quote Post
Inscure
post 29.04.2011, 22:22:59
Post #6





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


Trzeba zacząć od tego, że funkcje mysql_ nie są już zalecane do używania, w szczególnie jeśli chodzi o programowanie obiektowe.
Dużo lepszym rozwiązaniem jest skorzystanie z biblioteki PHPDataObject.
Sposób jej wykorzystania i część odpowiedzi na Twoje pytania zawarłem w krótkim artykule (jeśli mogę tak go nazwać) dotyczącym:

- łączenia z bazą;
- przekazywania instancji do kolejnych klas;

Zachęcam do analizy:

http://page-manager.com/forum/viewtopic.ph...9277228f31c061f

Sposób pobierania danych, zamieszczania, usuwania itd znajduję się tu:

http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO

Ten post edytował Inscure 29.04.2011, 22:26:48


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
Zyx
post 1.05.2011, 13:49:00
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Witaj Inscure, na Twoją prośbę przesłaną przez PW odpowiadam krótko: tę ideę można o kant czterech liter rozbić, bo z programowaniem obiektowym ma ona tyle wspólnego, co piernik z wiatrakiem. Po co Ci obiekty, skoro później budujesz na niej emulację zwykłego kodu proceduralnego? Po co w tej emulacji kodu tworzysz obiekt, który operuje jedynie na elemencie statycznym? Nie lepiej wszystko zrobić statycznie? Wreszcie, jak już robisz coś singletonopodobnego, to nazwij to odpowiednio. Wypadałoby też przeczytać krytykę tego wzorca projektowego.

Do zarządzania obiektami w aplikacji wymyślono całą masę elastyczniejszych i wyspecjalizowanych rozwiązań. Zamiast wyważać otwarte drzwi i tworzyć programistyczne potworki, poczytaj sobie o takich zagadnieniach, jak Dependency Injection. Jeśli zaś chodzi o magię, polecam to:

http://www.zyxist.com/pokaz.php/harryemu_juz_podziekujemy


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Inscure
post 1.05.2011, 17:27:04
Post #8





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


Zastanawiałem się nad dwoma typami rozwiązań problemu korzystania z metod jednej klasy w drugiej.
Oprócz powyższego rozwiązania miałem do dyspozycji wstrzykiwanie obiektu do klasy przez konstruktor.

Wybierając pierwszy sposób, w celach testowych i poznania opinii (między innymi Twojej), utworzyłem obiekt w z dwóch powodów:

- aby móc korzystać z metod obiektu w innej klasie bez dodatkowej roboty (ładowania do konstruktora zmiennej obiektu)
- poza klasami, używać $_sql->metoda();

Czekając na wypowiedź, trochę zastanawiałem się nad sensem tego rozwiązania i doszedłem właściwie do podobnych wniosków.
Rzeczywiście, lepszym rozwianiem jest zdecydowanie się, czy wszędzie korzystam w sposób statyczny z metod, czy może przeciwnie.

Obecnie robi się bałagan, bo emulacja statyczności jest jak wspomniałeś, nawiązaniem do Harrego wink.gif
Pojawia się jednak problem sfery PDO - metody tej klasy nie są statyczne (przynajmniej query()).

W związku z tym mam zamiar poprawić to w sposób taki, że będę wstrzykiwał zmienną obiektu do konstruktorów.
W innym wypadku, gdybym wszystko zrobił statycznie, to wraz wyszłoby na to samo, bo emulowałbym statyczność dla query().

Jakbym źle kombinował, proszę zwrócić mi uwagę wink.gif
Dziękuję za opinię.

Ten post edytował Inscure 1.05.2011, 17:44:43


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
pejott
post 1.05.2011, 17:55:40
Post #9





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Ja bym zdecydowanie zrezygnował z metod statycznych, ze względu że nie da się ich testować.
Jest wiele rozwiązań, ale według mnie najlepsze to właśnie DependencyInjection.
Stwórz obiekt połączenia z bazą a potem przekazuj go czy to setterami, czy w konstruktorze innych obiektów.

Pozdrawiam.
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: 28.04.2024 - 08:23