Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: metody ustaw i pobierz
Forum PHP.pl > Forum > PHP > Object-oriented programming
SN@JPER^
Czytając książke o OOP, nie rozumiem metod ustaw i pobierz...

Po co takie metody tworzyć? Nie można działać bezpośrednio na danych składowych?

np.

  1. ////////////////////////////////////////////////////////////////////
  2. function setInactiveSpanName($name){
  3. $this->inactivespanname = $name;
  4. //wywołuje funkcję zmieniającą nazwę przestrzni
  5. $this->createInactiveSpans();
  6. }
  7. ////////////////////////////////////////////////////////////////////
  8. function getInactiveSpanName(){
  9. return $this->inactivespanname;
  10. }
  11. ////////////////////////////////////////////////////////////////////
  12. function setPageDisplayDivName($name){
  13. $this->pagedisplaydivname = $name;
  14. }
  15. ////////////////////////////////////////////////////////////////////
  16. function getPageDisplayDivName(){
  17. return $this->pagedisplaydivname;
  18. }
  19. ////////////////////////////////////////////////////////////////////
  20. function setDivWrapperName($name){
  21. $this->divwrappername = $name;
  22. }
  23. ////////////////////////////////////////////////////////////////////
  24. function getDivWrapperName(){
  25. return $this->divwrappername;
  26. }
  27. ////////////////////////////////////////////////////////////////////
  28. function setFirstParamName($name){
  29. $this->firstparamname = $name;
  30. }
  31. ////////////////////////////////////////////////////////////////////
  32. function getFirstParamName(){
  33. return $this->firstparamname;
  34. }
  35. ////////////////////////////////////////////////////////////////////
wookieb
W twoim przypadku nie ma sensu tworzyć takich metod.
Tworzy się je wtedy jeżeli musisz skontrolować typ wartośći jaką podaje użytkownik do podanej właściwości. Np użytkownik podal liste elementów w formie stringa a nie tablicy i dzięki "setter"om takie coś sprawdzisz i skontrolujesz. Podobnie jest z innymi typami.
  1.  
  2. // wartosc musi byc instancja View
  3. public function setView(View $view)
  4. {
  5. $this->_view = $view;
  6.  
  7. }
  8.  
  9. // atrybut musi byc tablica
  10. public function setElement(array $elements)
  11. {
  12. // dodatkowa walidacja
  13. $this->_elements = $elements;
  14. }
  15.  
  16. // konwertujemy na int
  17. public function setOrder($order)
  18. {
  19. $this->_order = (int)$order;
  20. }


Gettery mogą mieć też parę innych przydatnych właściwości jak kontrola co i kiedy zwracać w wynikach.
Poniżej jest kontrola wyświetlania elementu.
  1.  
  2. public function blockDisplay($to)
  3. {
  4. $this->_displayLock = (bool)$to;
  5. }
  6.  
  7. public function display()
  8. {
  9. if($this->_displayLock) return '';
  10. else return $this->_display();
  11. }
  12.  
SN@JPER^
Np.

private $inactivespanname = "inactive";

żeby zmienić danę składową piszemy settera? Po co wtedy getter?

  1. public function setInactiveSpanName($name){
  2. $this->inactivespanname = $name;
  3. //wywołuje funkcję zmieniającą nazwę przestrzni
  4. $this->createInactiveSpans();
  5. }
  6. ////////////////////////////////////////////////////////////////////
  7. public function getInactiveSpanName(){
  8. return $this->inactivespanname;
  9.  
  10. ////////////////////////////////////////////////////////////////////
marcio
Po to zeby wartosc wyswietlic/pobrac bez niego takie cos:

  1. $obiekt -> polePrivate;


Zwroci blad tak samo z protected.

starach
W celu zachowania Enkapsulacji/Hermetyzacji. Niektórzy uważają nawet ( w tym ja ) że wszystkie zmienne klas powinno się opatrywać modyfikatorami private lub protected <edit>( ewentualnie protected )</edit>. Innymi słowy nie powinno się pozwalać na dostęp do zmiennych składowych klasy z poza niej samej.
SN@JPER^
No właśnie bo wookieb mówi o danych wprowadzonych przez usera. Jeżeli dane składowe sa private to po co setter, getter?
darko
Cytat(SN@JPER^ @ 14.01.2010, 16:48:28 ) *
No właśnie bo wookieb mówi o danych wprowadzonych przez usera. Jeżeli dane składowe sa private to po co setter, getter?

Po to, żeby mieć do nich dostęp (jako, że nie są to pola publicznie nie można ich sobie ot tak po prostu bezpośrednio ustawić, no chyba że magiczny setter/getter, ale to inna bajka), jeśli zachodzi taka potrzeba i żeby ten dostęp w jakiś sposób móc kontrolować/filtrować etc. Standardowo klasy nie pozwalają na dostęp do składowych o dostępie innym niż publiczny, toteż należy utworzyć getter i setter. Tylko o to chodzi w tym przypadku.
thek
Klasy w wielu obiektowych lub obiektowo orientowanych językach mają 3 tryby dostępu: publiczny (public), prywatny (private) i chroniony (protected). Różnica między nimi jest taka, że do publicznego możesz się odwoływać bezpośrednio
$obiekt_klasy -> atrybut
a więc zapis i odczyt są jawne. Wystarczy znać strukturę danych.

Prywatne są zabezpieczone i nie odczytasz ich ani nie zapiszesz nic do nich bez metod, które sama klasa Ci udostępnia. Odwołanie jak do publicznego spowoduje błąd. Jest to zabronione. Dlatego właśnie musisz napisać metodę, która pozwala go ustawić lub odczytać, a więc pozwala zrobić tak:
$obiekt_klasy -> odczytaj_pole_X();

Dostęp chroniony jest w samej klasie widoczny jako prywatny, ale klasa która po niej dziedziczy zamienia go w prywatny w swojej klasie (to zależy od języka programowania, gdyż w pewnych może on stać się publicznym ). Normalnie bowiem klasa nie dziedziczy pól klasy rodzica, a więc można powiedzieć, że dziecko wszystkie pola rodzica "zapomina", poza oczywiście tymi będącymi protected. Jeśli więc masz klasę A, zaś w niej pola public, private i protected, to po utworzeniu z niej klasy potomnej B znajdziesz wewnątrz tylko te, które były protected, ale będą one już teraz private (lub public w określonych językach).

Jak więc widzisz definicja dostępu sprawia, że pola zachowują się różnie. Inaczej do nich odwołujesz, inaczej zachowują w przypadku tworzenia klasy pochodnej.

Ale to są podstawy obiektówki, więc radzę Ci dobrze się przyłożyć do nich bo im głębiej w las tym więcej drzew o jakie można się rozbić.
Crozin
Thek... ale namieszałeś. Pyta o kompletne podstawy na forum PHP, to tłumacz tylko na przykładzie PHP, z którym będzie pracować.

O modyfikatorach dostępu pisać nie będę bo IIRC jest to kompletnie opisane w manualu.
Po co stosować gettery/settery?

1) Wspomniana hermetyzacja
2) Kontrola danych
3) Bardziej przyszłościowe rozwiązanie - zawsze można w przyszłości coś dodać, zachowując niezmienny zewnętrzny interface.
thek
Ja mu zrobiłem przyspieszony kurs z modyfikatorów dostępu winksmiley.jpg Można to maksymalnie rozwijać na kilka stron choćby, ale wolałem mu to przekazać "w pigułce". Jak na mnie i tak krótki post, a myślę, że opisałem to bardzo przystępnie. Raczej trudno to będzie opisać bardziej łopatologicznie, bez rozwlekania i sypania przykładami.
Crozin
No to zapomniałeś opisać o takich modyfikatorach jak chociażby pakietowy (z Javy). W C# istnieje chyba jeszcze pakietowy chroniony (ale nawet nie jestem pewien - nie znam tej tech., a przeszukiwać MSDN mi się nie chce :]).
thek
Wiesz... Można by jeszcze dodać od biedy static winksmiley.jpg Jest to w końcu także pewna forma dostępowa zmiennej o zasięgu ograniczonego nie tyle do obiektu klasy co wszystkich obiektów tejże klasy.
darko
Modyfikatory dostępu/specyfikatory w Javie, które mnie najbardziej zaintrygowały to: native oraz synchronized
Crozin
Native: gdy mamy jakąś metodę napisaną np. w C/C++ - więcej na: http://mindprod.com/jgloss/native.html
Synchronized: blokuje metodę/blok kodu dla innych wątków - więcej na: http://mindprod.com/jgloss/synchronized.html
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.