![]() |
![]() |
![]()
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 ->. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 13:56 |