Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana pola private parenta, przez dziecko.
Forum PHP.pl > Forum > PHP > Object-oriented programming
eseno
Witam.

Mam takie czysto teoretyczne pytanko. Mam poniższy kod:
  1. class klasa {
  2. private $zmienna;
  3. function __construct($wartosc) {
  4. $this->zmienna=$wartosc;
  5. }
  6. }
  7.  
  8.  
  9. class dzieckoKlasa extends klasa {
  10. function __construct($wartosc) {
  11. parent::__construct($wartosc);
  12. }
  13. public function zmien($wartosc){
  14. $this->zmienna=$wartosc;
  15. }
  16. }
  17.  
  18.  
  19. $cos=new dzieckoKlasa(4);
  20. var_dump($cos);
  21. $cos->zmien(5);
  22. var_dump($cos);


jako wynik otrzymuje :

object(dzieckoKlasa)[1]
private 'zmienna' (klasa) => int 4

object(dzieckoKlasa)[1]
private 'zmienna' (klasa) => int 4
public 'zmienna' => int 5

i teraz tak się zastanawiam, dlaczego dzieje się jak się dzieje. Teoretycznie, $zmienna jest private, więc dzieciak nie powinien tego widzieć. W publicznym konstruktorze rodzica sobie przypisał do tej zmiennej jakąś wartość (którą widać jako pole obiektu w var_dumpie), to dlaczego w chwili w której próbuję tą wartość zmienić, tworzy mi nową zmienną, o typie public? Czy jedyna możliwość zmiany takiej zmiennej to odwołanie się do jakiejś publicznej funkcji rodzica? Mam nadzieję, że rozumiecie o co mi chodzi.

I jeszcze pytanko o var_dumpa

object(dzieckoKlasa)[1]
private 'zmienna' (klasa) => int 4

co oznacza (klasa) w nawiasie ? W tym momencie (przed wywołaniem funkcji zmien()), obiekt $cos posiada pole $zmienna czy, go nie posiada? O to w zasadzie mi chodzi w całym tym pytaniu.
Dzięki z góry za zaspokojenie mojej ciekawości ;]
pozdrawiam.
mike
Winowajcą jest magiczna metoda __set(), której domyślne działanie sprawia, że do obiektu dynamicznie jest dodawane pole.

A teraz odpowiedzi na Twoje pytania:
Obiekt klasy dzieckoKlasa nie posiada pola zmienna i nie widzi pola zmienna z klasy bazowej.
Do obiektu klasy dzieckoKlasa pole zmienna jest dodane dynamicznie (w trakcie wykonywania skryptu) za sprawą właśnie __set().
W skrócie: obiekt klasy dzieckoKlasa nie posiada pola zmienna ale później już posiada smile.gif
eseno
Dzięki za odpowiedź.
Wiem, ze __set() działa tak w sytuacji w której zmienna nie istnieje. Dziwiło mnie co innego.
Mianowicie var_dump po stworzeniu dziecka wyrzuca coś takiego

object(dzieckoKlasa)[1]
private 'zmienna' (klasa) => int 4

gdyby $zmienna nie należała do tego obiektu klasy dzieckoKlasa, nie zostałaby wyrzucona na ekran. Obok jest nawias, który nie wiem co oznacza: "(klasa)".
Obiektu rodzica nie ma żadnego, więc wartość zmiennej (czyli 4), musi być w zapisana w obiekcie dziecko. Ale jak próbuje się do niego odwołać, wtedy jest tworzona nowa zmienna o tej samej nazwie (czyli to o czym Ty pisałeś). Mam nadzieję, że jasno się wyrażam, bo już mam do tego też wątpliwości.

W skrócie: gdzie w momencie działania var_dump jest przechowywana $zmienna?
wookieb
Cytat(mike @ 12.04.2011, 14:18:13 ) *
Winowajcą jest magiczna metoda __set(), której domyślne działanie sprawia, że do obiektu dynamicznie jest dodawane pole.

A widzisz, żeby ona została tutaj zdefiniowana? Bo ja nie.
mike
Cytat(wookieb @ 12.04.2011, 15:22:21 ) *
A widzisz, żeby ona została tutaj zdefiniowana? Bo ja nie.
Źle się wyraziłem. PHP domyślnie na obiektach dodaje pole jeśli go nie ma.
Co zresztą oznaczałoby że __set() domyślnie tak działa.

P.S.
A jak nie ma konstruktora to nie ma również domyślnego? Przecież go nie widać tongue.gif
Choć nie wykluczam, że możesz mieć rację. Już kilka lat w PHP nie pisałem.

~eseno PHP po prostu w ten sposób chce Ci pokazać, z czego składa się obiekt dzieckoKlasa.
Wyróżnia w ten sposób co jest public, protected i co jest w niedostępnym obszarze private. Bo przecież jeśli utworzyłeś obiekt klasy pochodnej to i wszystko to z czego składa się klasa bazowa również zostało utworzone.
Nie zmienia to faktu, że nie masz tam dostępu.
eseno
Dzięki, to rozwiewa (póki co wink.gif moje wątpliwości. Pzdr.
sarxos
Tak jak wyżej - prywatna zmienna z parenta nie jest widoczna w klasie potomnej, ale przez operator przypisania jest tworzony duplikat o tej samej nazwie. Zmienna ta ma tą samą nazwę, ale nie jest to ta sama zmienna. Gdybyś chciał wywołać prywatną metodę, to dostałbyś błąd, ale dla zmiennych to nie obowiązuje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.