Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] metody magiczne __set i __get
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam,


Napisałem sobie taką klasę :

  1. class Window {
  2.  
  3. function __set($name, $value) {
  4. $this->name = $value;
  5. }
  6.  
  7. function __get($name) {
  8. if(isset($name)) {
  9. return $this->name;
  10. } else {
  11. throw new Exception ('Pole '.$name.' nie istnieje');
  12. }
  13. }
  14. }


Ale jest jakiś błąd w metodzie __get w warunkach, z którym nie mogę sobie poradzić, a mianowicie :

gdy uruchamiam skrypt w ten sposób :

  1. try {
  2. $window = new Window();
  3. $window->height = 'wysokosc';
  4. echo $window->height;
  5. echo $window->width;
  6. } catch (Exception $e) {
  7. echo 'Błąd: ', $e->getMessage(), "\n";
  8. }



To dostaje takie coś :

Cytat
wysokoscwysokosc


A powinienem dostać cośtakiego :

Cytat
wysokosc
Błąd : Pole width nie istnieje


Chyba nie do konca rozumiem metode magiczna __get() czy może mi ktoś wyjaśnić co jest nie tak ?
deirathe
Zmień:
  1. class Window {
  2.  
  3. function __set($name, $value) {
  4. $this->name = $value;
  5. }
  6.  
  7. function __get($name) {
  8. if(isset($name)) {
  9. return $this->name;
  10. } else {
  11. throw new Exception ('Pole '.$name.' nie istnieje');
  12. }
  13. }
  14. }

na:
  1. class Window {
  2. public $vars;
  3. function __set($name, $value) {
  4. $this->vars[$name] = $value;
  5. }
  6.  
  7. function __get($name) {
  8. if(isset($this->vars[$name])) {
  9. return $this->vars[$name];
  10. } else {
  11. throw new Exception ('Pole '.$name.' nie istnieje');
  12. }
  13. }
  14. }
  15.  

W klasie Window nie masz wlasnosci $name a mimo to odwolujesz sie do niej z __get i __set co jest bledne bo wtedy znow jest wykonywane __get itd... __get powinno sie odwolywac do istniejacej wlasnosci w klasie smile.gif
darko
Masz błąd w getterze, linia 9

return $this->name;

zamień na

return $this->$name;

// edit

a gdzie w tej klasie masz pola height oraz width ? Magiczne getter i setter służą do pobrania/ustawienia wartości pól, ale nie do ich tworzenia.
Albo zdecyduj się na rozwiązanie zaproponowane przez deirathe, a propos, deirathe nie lepiej protected $vars; questionmark.gif
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.