Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Akcesory dostępu w metodach set i get
Forum PHP.pl > Forum > Przedszkole
fiasko
  1. <?
  2. Class Osoba {
  3.  
  4. private $imie ;
  5. private $nazwisko ;
  6. private $wiek = 10;
  7. private $plec = "M" ;
  8.  
  9.  
  10. public function set_Imie($i) {
  11. $this -> imie = $i ;
  12. }
  13.  
  14. public function get_Imie() {
  15. return $this -> imie;
  16. }
  17.  
  18.  
  19. public function set_Nazwisko($n){
  20. $this -> nazwisko = $n ;
  21. }
  22.  
  23. public function get_Nazwisko() {
  24. return $this -> nazwisko ;
  25.  
  26. }
  27.  
  28.  
  29. public function pokazuj(){
  30. echo $this -> imie ;
  31. echo " ";
  32. echo $this -> nazwisko ;
  33. }
  34.  
  35.  
  36. }
  37.  
  38. $os = new Osoba ;
  39. //$os -> set_Imie("Marjan") ;
  40. //$os -> set_Nazwisko("Kwiatowski");
  41. $os -> get_Nazwisko() ;
  42. $os -> pokazuj();
  43.  
  44.  
  45. ?>


Uczę się obiektówki i nie rozumiem jednej rzeczy jak wykorzystać metodę get_Imie() lub get_Nazwisko() w powyższej klasie. Co ta metoda ma za zadanie ? Ona coś zwraca czy służy do pobierania ?
Proszę o przykład jej wykorzystania w instancji klasy.
IceManSpy
Pola w metodzie mogę być wykorzystywane w metodach w klasie. Np masz klasę do wysyłania maili, w której metoda wyślij (bez parametrów) wysyła maile na podstawie pól z klasy. Ale by ustawić te zmienne, należy użyć metod set.
Trochę abstrakcyjny przykład, ale może trochę rozjaśni Ci działanie.
fiasko
Dobra ale wiedzę , że ta metoda get_Nazwisko() w swojej definicji zwraca coś - return $this -> imie;

Wobec tego mam pytanie jak odebrać zwracane dane odnosząc się poprzez instancję klasy ?
IceManSpy
Jedną z zasad OOP (obiektówki) jest to, że pola nie mogą być publiczne. Mogą być prywatne (private) lub chronione (protected). Więc mają pole imię jako prywatne nie zapiszesz na zasadzie:
  1. $obj = new Osoba();
  2. $obj->imie = "Pan Iks";
Do tego służą settery. A gettery pobierają te pola.
Nie możesz zrobić:
  1. $obj = new Osoba();
  2. echo $obj->imie;
To wywali błąd.
mortus
Cytat(IceManSpy @ 6.08.2011, 20:58:48 ) *
Jedną z zasad OOP (obiektówki) jest to, że pola nie mogą być publiczne.

Na pewno? Osobiście nie słyszałem o takiej zasadzie. Jak potrzebuje pola o zasięgu publicznym, to takie pole sobie tworzę.

Wracając do tematu. Zauważ, że pola w Twojej klasie Osoba są zadeklarowane jako prywatne:
  1. class Osoba {
  2. // ...
  3. private $imie;
  4. private $nazwisko;
  5. private $wiek = 10;
  6. private $plec = "M";
  7. // ...
  8. }

Oznacza to, że dostęp do tych pól mamy tylko i wyłącznie w ciele tej klasy. Aby móc zatem wydobyć (lub ustawić) imię czy nazwisko potrzebujemy metody publicznej, która będzie operować na polach prywatnych. U ciebie do tych metod należą: set_Imie(), get_Imie(), set_Nazwisko(), get_Nazwisko(). Przyjęło się nazywać te metody stosując angielskie przedrostki set i get na początku, ale równie dobrze mogłyby to być metody: ustaw_Imie(), pobierz_Imie(), ustaw_Nazwisko(), pobierz_Nazwisko(). Nazewnictwo ma tutaj "drugorzędne" znaczenie. Najważniejsze jest to, że publiczne metody nazywane setterami i getterami służą odpowiednio do ustawiania i pobierania wartości prywatnych pól klasy.

Jak się to wykorzystuje. Otóż zauważ, że tworząc nowy obiekt klasy Osoba nie tworzysz tak naprawdę osoby, a jedynie rezerwujesz w pamięci miejsce na dane tej osoby (przy czym domyślnie ma ona 10 lat i jest mężczyzną - jak każda inna osoba będąca obiektem Twojej klasy). Aby móc tę osobę lepiej identyfikować musisz ustawić jej imię i nazwisko. Do tego właśnie służą settery (metody klasy z przedrostkiem set) set_Imie() i set_Nazwisko(). Za pomocą getterów (metody klasy z przedrostkiem get) będziesz mógł natomiast te dane pobrać, kiedy będą Ci potrzebne. W tej chwili użycie tych publicznych metod jest jedynym sposobem na to, aby prywatnym polom klasy Osoba przypisać pewne wartości i jedynym sposobem na to, aby te wartości odczytać.

Złożenie "w tej chwili" zostało użyte celowo, bo alternatywą dla tak napisanych setterów i getterów może być przeciążenie domyślnych metod __set() i __get(). Ale o tym kiedy indziej.
ano
W Twoim przypadku tak naprawdę wszystkie pola mogłyby być publiczne [public].
Pola prywatne przydają się, kiedy np.: masz klasę, która wykonuje zaawansowane działania. Pewne ustawienia są zapisane w polach klasy. Użytkownik nie ma prawa ich zmienić bo inaczej całe 'obliczenia' się posypią.
  1. class ZaawansowanaKlasa {
  2. private $opcjeKlasy = '...';
  3. }


Następnie, możesz używać pól prywatnych gdy nie chcesz, żeby użytkownik miał możliwość ot tak zmiany jakiegoś pola.
Przykład:
tworzysz aplikację do zarządzania pracownikami w firmie. Masz obiekt "pracownik"
  1. class Pracownik {
  2. private $pensja;
  3. private $stazPracy;
  4. }

pensja zależy od stażu pracy. Więc w setterze stażu pracy wykonujesz też obliczenia, które odpowiednio ustawią pensję
  1. class Pracownik {
  2. private $pensja;
  3. private $stazPracy;
  4.  
  5. public function setStazPracy($staz) {
  6. $this->pensja = $staz*500;
  7. $this->stazPracy = $staz;
  8. }
  9. }

bez tego, koder mógłby sobie ot tak zmienić Pracownik->$stazPracy = 10, zapomnieć o zmianie pensji na poprawną i skutki byłyby opłakane wink.gif

Aha i ważna sprawa: nazewnictwo metod: nie get_Nazwisko() a ładniej getNazwisko() tongue.gif


ps
Cytat(IceManSpy @ 6.08.2011, 20:58:48 ) *
Jedną z zasad OOP (obiektówki) jest to, że pola nie mogą być publiczne.

a tego nawet nie czytaj wink.gif Chyba, że iceMan źle wyraził swoją myśl...
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.