![]() |
![]() |
![]()
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%) ![]() ![]() |
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: 13.10.2025 - 11:21 |