![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 13.02.2004 Skąd: Przasnysz Ostrzeżenie: (0%) ![]() ![]() |
Mam dwa obiekty. Jeden służy do inicjacji konfiguracji, obiektów pomocniczych, tworzenia instancji singletonów i innych drobnych rzeczy. Wszystkie obiekty w skrypcie dziedziczą z tego obiektu. Drugi obiekt dziedziczy z pierwszego i służy do wykonania konkretnego zadania.
Chciałem dodać (do pierwszego obiektu) wywoływaną zawsze z kontekstu drugiego obiektu prostą funkcję wyświetlającą print_r dla wszystkich zmiennych obiektu (żeby łatwiej było mi pisać i debugować). I tu napotkałem problem. Jeśli funkcja jest zadeklarowana w obiekcie pierwszym, to mimo tego, że wywoływana jest z obiektu drugiego, $this odwołuje się do obiektu pierwszego. Przygotowałem odrobinę kodu dla zilustrowania problemu (php5):
powyższy przykład generuje: Ponieważ w php nie ma czegoś takiego jak 'child' nie wiem co z tym zrobić. Ktoś ma jakiś pomysł jak to obejść? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
jedna zmienna w klasie głównej. ją zmieniasz w klasach potomnych:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 13.02.2004 Skąd: Przasnysz Ostrzeżenie: (0%) ![]() ![]() |
Nie o to chodzi. debug() powinno generować listę wszystkich zmiennych obiektu 2:
$zmienna_obj_1 odziedziczona została po obiekcie 1, $zmienna_obj_2 jest jej prywatną zmienną. Gdyby $zmienna_obj_2 była publiczna, funkcja działałaby prawie poprawnie, ale nie mogę i nie chcę zmieniać struktury obiektów po to żeby działała funkcja która tylko uprzyjemnia życie :-) |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
to w takim razie dodaj parametr fo funkcji debug, który będzie obiektem i w funkcji lub iterację po tym obiekcie. A wywoływać będziesz
edit: aczkolwiek pewnie też to nie zda egzaminu skoro zmienna jest prywatna. dorób funkcję debug do drugiej klasy ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 13.02.2004 Skąd: Przasnysz Ostrzeżenie: (0%) ![]() ![]() |
Dokładnie :-) Już wcześniej próbowałem.
Dodać debug() do drugiej klasy mógłbym i wtedy działałoby, ale nie chcę powtarzać tej samej funkcji w 30 klasach. Właśnie do tego ma służyć dziedziczenie ![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
w inncyh językach jest odatkowo protected (zminna prywatna ale dziedziczona). A php5? Spróbuj zamiast private dać protected
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 13.02.2004 Skąd: Przasnysz Ostrzeżenie: (0%) ![]() ![]() |
Protected jest, ale działa tylko w jedną stronę - tzn zmienne obj1 są widoczne dla obj2, ale zmienne obj2 nie są widoczne dla obj1. Poza tym - o to właśnie chodzi żeby nie zmieniać widoczności zmiennych. Mam dobre powody żeby część zmiennych była prywatna.
Problem można uogólnić. Deklaracja
to z jakiegoś powodu nie to samo co
Dlaczego? Gdyby był sposób żeby odwołać się do obiektu-dziecka nie wiedząc jaka to klasa, problem znikłby. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 15:03 |