![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli mam klasę o nazwie Polaczenie z prywatnym konstruktorem do połączenia z bazą danych, a chciałbym używać PDO (PDO umożliwia komunikację z wieloma bazami danych) to przez to, że mam prywatny konstruktor to nie mogę dziedziczyć po klasie PDO, bo inaczej dostaję błąd:
Access level to Polaczenie::__construct() must be public (as in class PDO) A ja chcialbym moc wysylac zapytania do bazy danych przy uzyciu funkcji prepare() pochodzacej z klasy PDO w ten sposob:
Ale dostaje blad: Call to undefined method Polaczenie::prepare() Bo ta metoda jest w klasie PDO. Co mam zrobic ? Moglbym caly powyzszy kod wstawic do specjalnie utworzonej w tym celu metody w klasie Polaczenie i wtedy byloby ok, ale co ja mam tworzyc dla kazdego inserta oddzielna metode w klasie Polaczenie ? To jak mialbym inserty wykonywane na tabelach np. ksiazki, autorzy itd. ladowac je wszystkie do klasy Polaczenie ? Bez sensu. Co powinienem zrobic ? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 195 Pomógł: 18 Dołączył: 7.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Call to undefined method Polaczenie::prepare() Czyli, że nie ma tej funkcjiUstaw ten konstruktor na publiczny i już. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie moge ustawic na publiczny w tym problem, bo chce miec singletona
![]()
Czy jest wiec jakies wyjscie ? |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Chociaż jeśli chodzi o połączenia do DB singleton jest dla mnie trochę mało wygodnym wyjściem, gdyż jeśli zechcesz korzystać z kilku baz naraz (może abstrakcyjne, w praktyce - przydaje się), to już masz trochę twardszy orzech do zgryzienia. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 15 Dołączył: 2.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Możesz też dodać do swojej klasy potomnej metody, które wykorzystujesz w PDO o odpowiednich nazwach (np. query, prepare) i wywoływać za pomocą parent:: metody główne w klasie PDO. Np.
Rozwiązanie o tyle dobre, że można dodać np. zliczanie lub cache'owanie zapytań. Ten post edytował Void 7.09.2009, 18:47:52 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Erix a mógłbyś rozwinąć myśl, bo nie bardzo rozumiem. "rejestr z połączeniem" - to w ogóle pierwszo słyszę, nie jestem w tym zaawansowany.
Void nie rozumiem - bo przecież nie mogę dziedziczyć po PDO - czy też może to rozwinięcie mysli Erixa, Erix zaproponował jakiś sposób, że będę mógł dziedziczyć po PDO (a którego ja nie zrozumiałem), a Ty kontynuujesz Jego mysl ? |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat to w ogóle pierwszo słyszę, nie jestem w tym zaawansowany. Wzorzec registry. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 15 Dołączył: 2.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Void nie rozumiem - bo przecież nie mogę dziedziczyć po PDO - czy też może to rozwinięcie mysli Erixa, Erix zaproponował jakiś sposób, że będę mógł dziedziczyć po PDO (a którego ja nie zrozumiałem), a Ty kontynuujesz Jego mysl ? Nie, ja przedstawiłem inną myśl ![]() ![]()
Albo wywal tego singletona, wtedy można zastosować dziedziczenie ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Serdecznie dziękuję za pomoc. Więc zgodnie z tym co napisał Erix i na podstawie klasy SingletonRegistry ze strony: http://www.phpfreaks.com/tutorial/design-p...gleton-registry zrobiłem tak:
Czyli dodałem:
A nastepnie:
I jest ok. Ale jako ze teraz przeczytalem sposob Voida to skorzystam chyba z Jego sposobu ![]()
Czy jesli usune Singletona to czy nie bede miec 5. polaczen do bazy danych zamiast 1. ? Ten post edytował wiewiorek 8.09.2009, 08:40:52 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Nie będziesz miał pięciu... Przecież skoro pobierasz uchwyt przez singleton, to zwracasz REFERENCJĘ, a nie klonujesz obiekt.
A tak w ogóle, to w Twoim przypadku może (nie próbowałem, na razie tylko klepane z palucha) byłoby najlepiej zrobić podobnie, jak singleton (ale nie tak samo ![]()
I wciąż mamy jedno połączenie, modeli tworzysz ile chcesz. :] -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Erix wielkie dzieki za propozycje, niestety po zastosowaniu Twego sposobu do swojej klasy (i oczywiscie zmodyfikowaniu Twego kodu pod swoje potrzeby) dostaje blad (
![]() Call to a member function pobieranieDanych() on a non-object u Ciebie to bylaby ta linia:
Jesli chodzi o singleton to wiem, ze zawsze jest jedno polaczenie, chodzilo mi o sytuacje gdybym nie zastosowal wzorca Singleton do klasy Polaczenie, a inne klasy dziedziczylyby po klasie Polaczenie - przyklad:
To wtedy utworzenie dwoch obiektow oznaczaloby pewnie dwa polaczenia do bazy danych zamiast jednego jak w przypadku zastosowania wzorca singleton do klasy Polaczenie. Najlepszym wyjsciem jest chyba tworzenie obiektu klasy Polaczenie i przekazywanie go do konstruktorow pozostalych klas:
Ten post edytował wiewiorek 8.09.2009, 16:43:37 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Call to a member function pobieranieDanych() on a non-object Pokaż, jak dokładnie wywoływałeś mój schemat; kod, daj var_dump na zmiennej połączenia i upewnij się, że wywołujesz konstruktor rodzica, bo mam obawy, że jednak tego nie robisz. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
No fakt - miałeś rację - zapomniałem, że w php konstruktor klasy nadrzednej trzeba samemu wywolac. Ale to i tak niewiele daje, bo musze pisac w klasie Ksiazki w kazdej metodzie zawierajacej zapytanie caly kod wlacznie z fetchowaniem i zamykaniem kursora oraz blokiem try/catch:
Moze wiec wrocic do tego sposobu z przekazywaniem do konstruktora klasy Ksiazki obiektu klasy Polaczenie - jak nizej ?
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 15 Dołączył: 2.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Masz złe podejście do programowanie obiektowego. Poczytaj trochę o ogólnych zasadach OOP, dziedziczeniu itp. W typowo modelowych klasach jakimi są Książki i Autorzy dziedziczysz po abstrakcyjnej klasie Polaczenie. Jaki to ma sens? Dziedziczenie wykorzystuje się do poszerzania możliwości klas w jakiś logiczny sposób ze sobą powiązanych - piszesz klasę ogólną, posiadającą jakieś podstawowe właściwości i metody charakterystyczne dla pewnego zbioru obiektów i dzięki klasom potomnym specjalizujesz ją (rozszerzasz jej działanie). Np. masz klasę Pojazd, która jest klasą abstrakcyjną - nie istnieje coś takiego jak "pojazd", nazywamy tak różne środki transportu służące do przemieszczania się, ale sam "pojazd" nie istnieje. Dopiero konkretne typy pojazdów (a raczej wypadałoby powiedzieć że to "Pojazd" jest typem dla konkretnych obiektów) można stworzyć i wykorzystywać. Klasy Samochód, Motocykl, Rower dziedziczą więc po klasie Pojazd - są pewną wyspecjalizowaną formą tej klasy (a przy tym są z nią logicznie powiązane).
Wracając do twojego przykładu - Połączenie nie jest w żaden sposób typem dla obiektu Książka, ani Autor. Klasy te mogą posiadać informację o połączeniu z bazą, ale na pewno nie w wyniku dziedziczenia. Możesz więc przekazywać uchwyt połączenia z bazą w argumencie konstruktora klasy Książka i przechowywać go w prywatnym polu tej klasy. Możesz też wykorzystać tzw. rejestr (wzorzec registry), czyli taki globalny pojemnik na różne obiekty (oparty na singletonie), do którego wrzucasz sobie obiekt połączenia i uzyskujesz do niego dostęp w dowolnym momencie programu. Niektórzy nie lubią takiego rozwiązania, ze względu właśnie na tą "globalność", ale czasami może być wygodne. Poza tym możesz spróbować dowiedzieć się trochę i zaimplementować wzorzec context |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 247 Pomógł: 11 Dołączył: 5.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
"Możesz więc przekazywać uchwyt połączenia z bazą w argumencie konstruktora klasy Książka i przechowywać go w prywatnym polu tej klasy." - no wlasnie tak sadzilem, ze to byloby najwygodniejsze i najlepsze rozwiazanie jak w moim poprzednim poscie (jego druga czesc)
![]() Dzieki za uwage odnosnie dziedziczenia w tym wypadku, aczkolwiek w zyciu to chyba roznie z tym bywa - np. wczoraj natknalem sie na cos takiego: http://webinside.pl/artykul-369-zachowanie...ebie-klasy.html ![]() Ten post edytował wiewiorek 8.09.2009, 20:51:04 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 04:05 |