Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Programowanie obiektowe w PHP, akcesory
Aardenon
post 28.08.2011, 10:16:01
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 28.08.2011

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


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.
Go to the top of the page
+Quote Post
mortus
post 28.08.2011, 11:32:06
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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

Ten post edytował mortus 28.08.2011, 11:50:58
Go to the top of the page
+Quote Post
Fifi209
post 28.08.2011, 18:52:55
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Ja bym dodał, że takie wykorzystanie jest raczej kiepskim pomysłem. wink.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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: 26.04.2024 - 10:41