@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:
$a = new A();
$a->atrybut1 = 1;
$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:
$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:
$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):
class A {
private $atrybut1;
public $publiczna;
public function __set($property, $value) {
$this->$property = $value;
}
public function __get($property) {
return $this->$property;
}
}
$a = new A();
$a->atrybut1= 5; // wywołujemy naszą metodę __set(), ustawiamy wartość istniejącej zmiennej prywatnej $atrybut1 na 5
echo $a->atrybut1; // wywołujemy naszą metodę __get(), pobieramy wartość istniejącej prywatnej zmiennej $atrybut1 $a->atrybut2 = 5; // nie wywołujemy naszej metody __set(), ustawiamy wartość nowej zmiennej publicznej $atrybut2 na 5
echo $a->atrybut2; // nie wywołujemy naszej metody __get(), pobieramy wartość przed chwilą utworzonej zmiennej publicznej $atrybut2 $nazwa_atrybutu = 'atrybut3';
$a->$nazwa_atrybutu = 5; // nie wywołujemy naszej metody __set(), ustawiamy wartość nowej zmiennej publicznej o nazwie $atrybut3 na 5
echo $a->$nazwa_atrybutu; // nie wywołujemy naszej metody __get(), pobieramy wartość przed chwilą utworzonej zmiennej publicznej o nazwie $atrybut3 $a->publiczna = 5; // nie wywołujemy naszej metody __set(), ale ustawiamy wartość istniejącej zmiennej $publiczna na 5
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.
EDITPoprawiłem pewne błędy składniowe wypowiedzi, aby wypowiedź brzmiała ściślej.