Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dziedziczenie __get i __set, Czy jest mozliwe ?
Reigon
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #3





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


?

Ten post edytował Sedziwoj 16.06.2007, 19:39:12
Go to the top of the page
+Quote Post
Reigon
post
Post #4





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

Ostrzeżenie: (0%)
-----


No tak, chlopaki:
Cysiaczek - no wlasciwie o tym dokladnie pisalem (IMG:http://forum.php.pl/style_emoticons/default/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)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:14