![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Chciałem zrobić uniwersalną implementację dla metody magicznej __get($var). W tym celu, w klasie abstractObject napisałem coś takiego:
Natomiast w klasie dziedziczącej coś takiego:
Powiem szczerze, że jestem zszokowany koniecznością napisania czegoś takiego. Myślałem, że dziedzicząc __geta, klasa dziedzicząca pobierze normalnie swoje pole. Natomiast gdy mój kod wyglądał w ten sposób, że w klasie dziedziczącej nie było nic dotyczącego tej metody, a w abstractObject nie było komentarza przy returnie, wywalało mi komunikat: Cytat Notice: Undefined property: tag::$(tu nazwa zmiennej do której się odwoływałem) in... Natomiast jeśli chodzi o dziedziczenie magicznej metody __set(), jest jeszcze gorzej. Kod wygląda tak: (klasa abstractObject)
Jedno pytanie: dlaczego tak się dzieje? :-( Ten post edytował Asmox 11.11.2011, 15:18:28 -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Dzieje się tak, ponieważ każda klasa ma domyślne metody __set() i __get(). Zatem przeciążamy te metody w klasie rodzicielskiej, tworzymy klasę rozszerzającą klasę rodzicielską i domyślne metody __set() i __get() klasy potomnej przeciążają te nasze - już wcześniej przeciążone. Takie błędne koło.
Po prostu jeśli metody w klasie rodzicielskiej i potomnej nazywają się tak samo, i mają taki sam zasięg, to te z klasy potomnej przeciążają te z klasy rodzicielskiej. A metody __set() i __get() istnieją zawszę i korzystamy z nich za "sprawą" operatora wyłuskania ->. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Czyli co mam zrobić? Pisać takie samy metody w każdej klasie?
-------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Musisz pamiętać, że metody __set() i __get() służą do ustawiania i pobierania wartości zmiennych prywatnych i chronionych. Jeśli w klasie nie masz np. prywatnej zmiennej $a, a użyjesz kodu
to tak naprawdę nie zadziałają Twoje metody __set() i __get(), a zadziałają te metody domyślne. W obiekcie danej klasy od tej chwili będziesz miał zmienną $a, ale będzie to zmienna publiczna, którą możemy ustawić/pobrać nie przeciążając metod __set()/__get(). Dlatego używanie przeciążonych metod __set() i __get() w ten sposób, w jaki Ty to robisz mija się z celem, chyba, że każdą zmienną jaką później będziesz dodawał masz zadeklarowaną jako prywatną lub chronioną. Lepszy podejściem byłoby coś takiego:
Jeżeli zatem koniecznością u Ciebie jest przeciążanie metod __set() i __get(), to nie masz innego wyjścia, jak przeciążać te metody dla każdej klasy, czy to potomnej, czy rodzicielskiej. Natomiast zastanów się, czy rzeczywiście jest Ci to potrzebne. Zamiast się zastanawiać możesz również sprawdzić, jaki będzie zasięg (widoczność) tych Twoich zmiennych, robiąc var_dump jakiegoś przykładowego obiektu. Kiedyś już coś na ten temat pisałem. Poczytaj. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 19:58 |