Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Programowanie obiektowe w PHP, akcesory
Forum PHP.pl > Forum > Przedszkole
Aardenon
Witam,

Czytam rozdział nt. programowania obiektowego w PHP i czegoś tu nie rozumiem. Mam taki przykład:

  1. class nazwaklasy
  2. {
  3. public $atrybut;
  4. function __get($nazwa)
  5. {
  6. return $this->$nazwa
  7. }
  8. function __set($nazwa, $wartosc)
  9. {
  10. $this->$nazwa = $wartosc;
  11. }
  12. }


1. Skoro __get oraz __set to nazwy zastrzeżone, czy to oznacza że może istnieć tylko jedna para takich akcesorów dla klasy?
2. W jaki sposób mogę za pomocą jednej pary akcesorów przypisać wartości dla większej liczby atrybutów, np $atrybut1, $atrybut2, $atrybut3 ? Czy do tego służy konstrukcja ze zmienną $nazwa w powyższym przykładzie?
3. Dlaczego w powyższym przykładzie występuje zmienna $nazwa, skoro moim celem jest odczytanie lub ustawienie zmiennej $atrybut?
4. W książce jest przykład:
  1. $a = new nazwaklasy();
  2. $a->$atrybut = 5; //to wywołuje niejawnie akcesor __set

i w książce jest takie objaśnienie: "Instrukcja ta niejawnie wywoła funkcję __set() z wartością zmiennej $nazwa ustawioną na "atrybut" i z wartością równą 5". To skąd PHP wie, że zmiennej $nazwa ma przypisać zmienną $atrybut? Nie bardzo rozumiem tą konstrukcję.

Z góry dzięki za odpowiedzi,
PR.
mortus
@Magic WWW Głupoty wypisujesz!

1. To, że __set() i __get() to nazwy zastrzeżone oznacza jedynie tyle, że silnik PHP wykorzystuje już te dwie metody. My na swoje potrzeby możemy te metody przeciążyć, co oznacza, że domyślne metody __set() i __get() zostaną zastąpione naszymi. Niemniej jednak, może istnieć tylko jedna para takich akcesorów dla jednej klasy. Pomiędzy tymi faktami nie ma żadnej zależności.

2. No właśnie tak:
  1. $a = new A();
  2. $a->atrybut1 = 1;
  3. $a->atrybut2 = 2;

przy czym pola (nazywane inaczej właściwościami klasy) muszą być prywatne lub chronione i przede wszystkim muszą w tej klasie być, ale o tym szerzej za chwilę.

3. Zmienna $nazwa określa nam nazwę pola (właściwości klasy), którą chcemy ustawić. Użycie:
  1. $a->zmienna = 5;

spowoduje, że w obiekcie naszej klasy zostanie ustawione pole o nazwie 'zmienna' (@Magic WWW - nie obiekt).

4. Wyżej wspomniana nazwa "pobierana" jest z konstrukcji:
  1. $a->atrybut = 5;

Operator -> jest nazywamy operatorem wyłuskania, a powyższy zapis oznacza "wyłuskaj/wydobądź z obiektu $a pole (właściwość) o nazwie atrybut i nadaj jej wartość 5".

Zarówno ten kod, który nam podałeś (może źle przepisałeś z książki, albo autor książki popełnił błąd), jak i ten, który podał Magic WWW, w przypadku tak skonstruowanej klasy jest nieprawidłowy, a dokładniej w obu przypadkach nasze metody __set() i __get() nie są wykorzystywane w ogóle (@Magic WWW - w Twoim kodzie również). A teraz kod, który mam nadzieję wszystko objaśni (radzę przeczytać komentarze):
  1. class A {
  2. private $atrybut1;
  3. public $publiczna;
  4. public function __set($property, $value) {
  5. $this->$property = $value;
  6. }
  7. public function __get($property) {
  8. return $this->$property;
  9. }
  10. }
  11. $a = new A();
  12. $a->atrybut1= 5; // wywołujemy naszą metodę __set(), ustawiamy wartość istniejącej zmiennej prywatnej $atrybut1 na 5
  13. echo $a->atrybut1; // wywołujemy naszą metodę __get(), pobieramy wartość istniejącej prywatnej zmiennej $atrybut1
  14. $a->atrybut2 = 5; // nie wywołujemy naszej metody __set(), ustawiamy wartość nowej zmiennej publicznej $atrybut2 na 5
  15. echo $a->atrybut2; // nie wywołujemy naszej metody __get(), pobieramy wartość przed chwilą utworzonej zmiennej publicznej $atrybut2
  16. $nazwa_atrybutu = 'atrybut3';
  17. $a->$nazwa_atrybutu = 5; // nie wywołujemy naszej metody __set(), ustawiamy wartość nowej zmiennej publicznej o nazwie $atrybut3 na 5
  18. echo $a->$nazwa_atrybutu; // nie wywołujemy naszej metody __get(), pobieramy wartość przed chwilą utworzonej zmiennej publicznej o nazwie $atrybut3
  19. $a->publiczna = 5; // nie wywołujemy naszej metody __set(), ale ustawiamy wartość istniejącej zmiennej $publiczna na 5
  20. echo $a->publiczna; // nie wywołujemy naszej metody __get(), ale pobieramy wartość istniejącej zmiennej $publiczna

Nasze metody __set() i __get() są uruchamiane tylko wtedy, gdy chcemy ustawić i odczytać wartości pól (właściwości) publicznie niedostępnych. Co w praktyce oznacza, że mogą to być jedynie zmienne prywatne, a w szczególnych przypadkach również chronione.

EDIT
Poprawiłem pewne błędy składniowe wypowiedzi, aby wypowiedź brzmiała ściślej.
Fifi209
Ja bym dodał, że takie wykorzystanie jest raczej kiepskim pomysłem. wink.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.