Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> proste pytanie __set __get
marcintom
post 31.07.2006, 19:37:31
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 11.09.2005

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


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

Ten post edytował marcintom 31.07.2006, 19:43:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
thornag
post 31.07.2006, 19:52:17
Post #2





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


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.


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
Jim
post 31.07.2006, 19:58:12
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 0
Dołączył: 27.07.2005

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


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. ?>
Go to the top of the page
+Quote Post
marcintom
post 31.07.2006, 20:05:07
Post #4





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 11.09.2005

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


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ę.
Go to the top of the page
+Quote Post
Levabul
post 31.07.2006, 20:12:49
Post #5





Grupa: Zarejestrowani
Postów: 197
Pomógł: 0
Dołączył: 11.07.2005

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


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


Ten post edytował Levabul 31.07.2006, 20:25:40


--------------------
Go to the top of the page
+Quote Post
thornag
post 31.07.2006, 20:12:54
Post #6





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


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

Ten post edytował thornag 31.07.2006, 20:14:44


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
marcintom
post 31.07.2006, 20:32:16
Post #7





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 11.09.2005

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


Przykład Levabul 'a jak najbardziej JUŻ zrozumiały smile.gif - dzieki

Ale nie za bardzo wiem cóż to takiego te avatary sad.gif
Go to the top of the page
+Quote Post
kwiateusz
post 31.07.2006, 20:36:56
Post #8


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




http://pl.wikipedia.org/wiki/Avatar inaczej ten viper (samochód) co jest obok mojego posta ;]

Ten post edytował kwiateusz 31.07.2006, 20:37:17
Go to the top of the page
+Quote Post
marcintom
post 31.07.2006, 20:54:22
Post #9





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 11.09.2005

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


Acha. biggrin.gif

PS
Rozpoznaje vipery tongue.gif
Go to the top of the page
+Quote Post
hwao
post 1.08.2006, 13:13:54
Post #10


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Możesz sobie popatrzeć tutaj
http://hwao.be/blog/2006/05/02/monitorowanie-obiektu/
Go to the top of the page
+Quote Post
marcintom
post 1.08.2006, 15:30:40
Post #11





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 11.09.2005

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


Dziekuje za link.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:23