Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie __get i __set
Forum PHP.pl > Forum > PHP > Object-oriented programming
Reigon
Mialem napisac pytanie, ale wlasciwie troche potestowalem i napisze solucje (moze komus sie przyda i zaoszczedzi troche czasu)
Problem: dziedziczenie i poprawne funkcjonowanie metod magicznych __get i __set w klasach potomnych
  1. <?php
  2. class person
  3. {
  4. public function __construct()
  5. {
  6. echo 'ok. person!';
  7. }
  8. public function __get($name)
  9. {
  10.  return $this->{$name};
  11. }
  12. }
  13. class driver extends person
  14. {
  15.  private $imie;
  16. public function __construct()
  17. {
  18. echo 'ok. driver!';
  19. }
  20. public function setImie($val)
  21. {
  22.  $this->imie = $val;
  23. }
  24. public function __get($name)
  25. {
  26.  parent::__get($name);
  27. }
  28. }
  29.  
  30. $a = new person;
  31. $b = new driver;
  32. $b->setImie('jasio');
  33.  
  34. echo $b->imie;
  35. ?>


Powyzszy kod nie wyswietli poprawnie wlasnosci imie z klasy potomnej. Po pierwsze dlatego, ze jest ona zadeklarowana, jako prywatna. Nie zadziala rowniez, gdy ustawimy ja na publiczna lub chroniona, gdyz w tym wypadku parent:: nie dziala jak w konstruktorze i __get bedzie (chyba) probowal szukac wlasnosci w klasie macierzystej.

Wniosek: z klasie potomnej zrezygnowac nadpisywania czesciowego, a wlasnosci zadeklarowane powinny byc na publiczne lub prywatne


Jezeli sie myle, prosze o poprawe. Chcialem skorzystac z magicznych metod dostepowych __get i __set i dziedziczyc je z modelu bazowego (klasy macierzystej) w modelach konkretnych (klasy potomne) w MVC, ale wyglada na to, ze bedzie trzeba je powielac.
Cysiaczek
Po czesci masz rację - zmiana na protected i nieprzesłanianie gettera w ptomnej daje ocekiwane rezultaty.

  1. <?php
  2. class person
  3. {
  4.  
  5. public function __construct()
  6. {
  7. echo 'ok. person!';
  8. }
  9. public function __get($name)
  10. {
  11.  return $this->{$name};
  12. }
  13. }
  14. class driver extends person
  15. {
  16.  protected $imie;
  17. public function __construct()
  18. {
  19. echo 'ok. driver!';
  20. }
  21. public function setImie($val)
  22. {
  23.  $this->imie = $val;
  24. }
  25.  
  26. }
  27.  
  28.  
  29. $b = new driver;
  30. $b->setImie('jasio');
  31.  
  32. echo $b->imie; // jasio
  33.  
  34. ?>


Pozdrawiam.
Sedziwoj
A może:
  1. <?php
  2. class person
  3. {
  4. public function __construct()
  5. {
  6. echo 'ok. person!';
  7. }
  8. public function __get($name)
  9. {
  10.  return $this->{$name};
  11. }
  12. }
  13. class driver extends person
  14. {  
  15.  //nie może być private
  16.  protected $imie;
  17. public function __construct()
  18. {
  19. echo 'ok. driver!';
  20. }
  21. public function setImie($val)
  22. {
  23.  $this->imie = $val;
  24. }
  25. public function __get($name)
  26. {
  27.  return parent::__get($name);
  28. }
  29. }
  30.  
  31. $a = new person;
  32. $b = new driver;
  33. $b->setImie('jasio');
  34.  
  35. echo $b->imie;
  36. ?>


?
Reigon
No tak, chlopaki:
Cysiaczek - no wlasciwie o tym dokladnie pisalem smile.gif
Sedziwoj - moze byc tez takie rozwiazanie, ale nie zmienia to faktu, ze wlasnosci musza byc deklarowane jako chronione lub publiczne, a zazwyczaj jednak sa prywatne i czesto chcemy aby tak pozostalo. W takim wypadku lepiej juz chyba, aby kazda klasa posiadala swoje metody dostepowe (badz to magiczne badz wklepane settery i gettery)
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.