Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: proste pytanie __set __get
Forum PHP.pl > Forum > PHP
marcintom
witam serdecznie
Nie moge za bardzo załapać o co chodzi z tymi magicznymi metodami __set __get
na wikipedi jest napisane

__get() metoda jednoparametrowa, jej parametr to nazwa pola, którego nie ma w obiekcie, a była próba odczytania jej wartości

próba jaka próba nie rozumie za bardzo. gdyby ktoś mógł to jasno zpreceyzować to będę ogromnie wdzięczny


__set() metoda dwuparametrowa, gdzie pierwszy parametr to nazwa pola a drugi to wartość przypisana, metoda ta wykonywana jest w momencie, gdy chcemy przypisać wartość do pola, które nie zostało zawarte w obiekcie.

To w sumie jeszcze łapię chociaż nie do końca rozumie jakie mogłoby być przykładowe zastosowanie tworzenia nowej składowej na zewnątrz klasy.

Ogólnie prosiłbym o jakiś prosty konkretny przyklad albo jakies objasnienie problemu.

W pewnej książce znalazłem coś takiego.
  1. <?php
  2. class nazwaklasy
  3. {
  4.  var $atrybu;
  5.  function __get($nazwa)
  6.  {return ($this->$nazwa).'get'; // tu dodalem od siebie get
  7.  }
  8.  function __set($nazwa,$wartosc)
  9.  {$this->$nazwa = $wartosc.'set'; // tu dodalem od siebie set 
  10.  }
  11. }
  12. $a = new nazwaklasy();
  13. $a->atrybut = 5;  // zekomo to mialo korzystać z metody __set ale nie korzysta 
  14. $a->atrybut;  // to z kolei mialo korzystać z metody __get i też nie korzysta
  15. ?>


kurde swoją drogą sam nie wiem jak można napisać coś w książce jeżeli to nie ma pokrycia w rzeczywistości blink.gif
thornag
Polega to na tym, ze jesli robisz odwolanie do wlasciwosci ktora nie istnieje (czy metody <<__call>>) funkcje te przechwyca zadanie.

W najbardziej lakonicznym przykladzie metody np __get mozna uzyc do obslugi bledu.

Mowiac scislej jesli probujesz zrobic $obj->nieistniejacy metoda __get przechwyci to zadanie i moze np wyprintowac "Zadana wlasciwosc nie istnieje".

Jednakze mozna zrobic jesio wiele roznych rzeczy dzieki tym metoda, odsylam do artykulu w ktorym podanych jest wiecej zrozumialych i mysle dobrych przykladow (sorry za konkurencje tongue.gif ) Czesc pierwsza o programowaniu obiektowym warto przeczytac pozostale dwa.

Powodzenia.
Jim
biorąc na tapetę Twój przykład:
  1. <?php
  2. class nazwaklasy
  3. {
  4. function __get($nazwa) {
  5. return 'Nastąpiła próba odczytania zmiennej o nazwie `'.$nazwa.'`, która nie istnieje w obiekcie, ';
  6. }
  7.  
  8. function __set($nazwa,$wartosc) {
  9. $this->$nazwa = $wartosc.'set ';
  10. }
  11. }
  12. $a = new nazwaklasy();
  13.  
  14. $a->atrybut = 5; // w tym momencie zostje wywołana metoda __set('atrybut',5)
  15. echo $a->atrybut; // co da '5set'
  16.  
  17. echo $a->atrybut2; // ten parametr nie istnieje, więc zostanie uruchomione __get('atrybut2')
  18. ?>
marcintom
Czyli ta metoda __get z książki to jakieś przegięcie.
Zgodnie z tym co mi sugerujecie - za co dziekuje - kod tej metody nie ma sensu bo nigdy nie zwróci czegoś czego nie ma .
Hmm Teraz już to chyba łapę.
Levabul
Cytat
..$obj->nieistniejacy metoda...
Nie nieistniejąca metoda, a nieistniejące pole tongue.gif.

Cytat
Zgodnie z tym co mi sugerujecie - za co dziekuje - kod tej metody nie ma sensu bo nigdy nie zwróci czegoś czego nie ma .
Mylisz się smile.gif metoda __set może np. zapisywać wartości pól w wcześniej zdefiniowanej tablicy, natomiast __get odczytywac je z tej tablicy np.
  1. <?php
  2. class dbRecord {
  3.  
  4. protected $aFields = array ();
  5.  
  6. public function __set ($sName, $sValue) {
  7. $this -> aFields[$sName] = $sValue;
  8. }
  9. public function __get ($sName) {
  10. if (array_key_exists ($sName, $this -> aFields)
  11. return $this -> aFields[$sName];
  12. else
  13. throw new Exception ('Pole '.$sName.' nieistnieje!');
  14. }
  15. }
  16. ?>
thornag
Metoda uzyteczna jak najbardziej, dosc obrazowym przykladem acz niekoniecznie rzeczywistym moze byc np pobieranie obrazkow.

Wyswietlasz avatary ktora sa przechowywane przez wlasciwosci klasy (jak mowilem malo to zyciowe), w koncu ktos nie uploadowal avatara, wiec zadanie przechwytuje __get i wyswietla np jakis domyslny obraz.

Ogolnie mozna tym zabezpieczyc przed bledami np literowkami. Mimo wszystko niejednokrotnie czytalem, ze raczej powinno sie tworzyc wlasne metody dostepowe do wlasciwosci. Takze wsie wlasciwosci private/protected no i metody dostepowe do tego. To jest tak zwana hermetyzacja aarambo.gif

@Levabul przeczytaj to jako ...nieistniejacy, wtedy wlasnie metoda __get :PPPPPPPPPP
marcintom
Przykład Levabul 'a jak najbardziej JUŻ zrozumiały smile.gif - dzieki

Ale nie za bardzo wiem cóż to takiego te avatary sad.gif
kwiateusz
http://pl.wikipedia.org/wiki/Avatar inaczej ten viper (samochód) co jest obok mojego posta ;]
marcintom
Acha. biggrin.gif

PS
Rozpoznaje vipery tongue.gif
hwao
Możesz sobie popatrzeć tutaj
http://hwao.be/blog/2006/05/02/monitorowanie-obiektu/
marcintom
Dziekuje za link.
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.