![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam taki mini problem, mam o to taki zestaw klas:
Gdy działam na obiekcie klasy Concrete, php wywala mi taki komunikat: Cytat Strict Standards: Declaration of D::setObject() should be compatible with that of C::setObject() in [...] Co o tym myślicie, czy nie jest to troszkę na wyrost? Wiadomo, co chciałem przez to osiągnąć... Jak do tego podejść tak w ogóle? Pozdrawiam Ten post edytował likemandrake 3.02.2009, 19:46:48 -------------------- serwiswww.pl
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem pytania. Co jest na wyrost? Od tego są klasy abstrakcyjne, żeby je potem rozszerzać w klasach potomnych. I tyle. Jak deklarujesz metodę w funkcji abstrakcyjnej to klasa dziedzicząca musi implementować tą metodę. Tak to działa.
Pozdrawiam! -------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 316 Pomógł: 36 Dołączył: 2.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zdaje się, że obie metody setObject() powinny przyjmować jako argument ten sam typ, a u ciebie to A i B :]
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dokładnie wiem jak to działa
![]() Zdaje się, że obie metody setObject() powinny przyjmować jako argument ten sam typ, a u ciebie to A i B :] No właśnie, PHP mi nakazuje aby te metody były ze sobą kompatybilne, mimo tego, że nie są to metody abstrakcyjne. Stąd moje pytanie, jak do tego podejść. Po za tym jak widać klasa B dziedziczy po klasie A.... -------------------- serwiswww.pl
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Faktycznie moje niedopatrzenie. Wygląda to na błąd PHP w sumie. Dziwna sprawa ![]() Pozdrawiam! -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ściągnąłem ograniczenie abstract z klasy C i D i komunikat pojawia się nadal. Dopiero, gdy w metodzie D::setObject() zmienię przyjmowany parametr na A, PHP nie warczy, a tego nie mogę tak zrobić.
Wniosek z tego taki, że PHP w wersji 5.2.6 ma taki specyficzny błąd. Czy mógłby ktoś przetestować taki zestaw klas w PHP 5.2.8? Zaznaczam, że przed wczytaniem pliku z zestawem klas z powyższego kodu musimy ustawić raportowanie błędów na 'E_ALL | E_STRICT'. -------------------- serwiswww.pl
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat No właśnie, PHP mi nakazuje aby te metody były ze sobą kompatybilne, mimo tego, że nie są to metody abstrakcyjne. Stąd moje pytanie, jak do tego podejść. W php nie ma przeciazania metod (ta sama nazwa a inne parametry) - wiec nadpisujesz metode w podklasie (zmieniasz jej implementacje), a wiec musza miec te same paramery. Skoro ja nadpisujesz to musisz zachowac jej sygnature - typ parametru (skoro go specyfikujesz), czemu? Z definicji OOP:
Tworzysz sobie obiekt typu C (czyli klasy C lub pochodnych == klasy C, D, Concrete, whatever). Zgodnie z polimorfizmem mozesz wymienic obiekt na inna podklase klasy C, i powinienes miec mozliwosc wykonywania na nim tych samych operacji, tu: przekazania obiektu klasy A do metody setObject(), ale
Wiem ze PHP to nie Java/C# i ze jest dynamicznym jezykiem, ale po co w takim razie korzystasz z type-hintingu skoro nie chcesz sie do jego zasad dostosowac?
// pomógł++ // ayeo -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Programowałem w C++ i rzeczywiście jeśliby klasy które napisałem powyżej przestawić na ten język, klasa D zawierałaby dwie wersje metod (taką która przyjmuje obiekty klasy A, oraz taką która przyjmuje obiekty klasy B ).
To by wszystko wyjaśniało, dlaczego tak się dzieje w PHP, możnaby sobie powiedzieć, że z powodu braku funkcji przeładowywania metod, programiści mogliby rozwiązać ten problem inaczej ![]() Cóż najlepszym w takim wypadku będzie w metodzie klasy D przyjmować parametr typu A, oraz rzucać wyjątek w metodzie, jeśli nie przekazano obiektu klasy B. Pozdrawiam Ten post edytował likemandrake 3.02.2009, 21:37:19 -------------------- serwiswww.pl
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A czy przypadkiem klasy A i B nie mogłby implementować jakiegoś interfaceu, a metoda setObject mieć sygnaturę public setObject(myInterface)? Chyba, że te dwa obiekty mają robić coś zupełnie innego, ale wtedy możnaby zacząć się zastanawiać czy aby napewno to co robisz jest poprawne?
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tak, mam interfejs, po którym dziedziczy podana wyżej klasa C.
Klasa A, jest to klasa z pakietu Zend Framework, klasa B jest moją klasą, która rozszerza o pare dodatkowych funkcji klasę A. Znów klasa D dziedziczy po klasie C, ale w porównaniu do klasy C, klasa D korzysta z dodatkowych funkcji nadanych w klasie B. Efekt jest taki, że klasa, która tu w ogóle nie jest opisana, wymagająca w/w interfejsu, dostaje to co chce i w taki sposób jak powinna. Dane na których wspomniana nieopisana klasa operuje są przygotowane w lepszy sposób przy użyciu zestawu D i B, niż gwarantowałby mi to zestaw C i A. Pozdrawiam -------------------- serwiswww.pl
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 20:16 |