Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> metody ustaw i pobierz
SN@JPER^
post 13.01.2010, 16:23:53
Post #1





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


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. ////////////////////////////////////////////////////////////////////
Go to the top of the page
+Quote Post
wookieb
post 13.01.2010, 16:38:42
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.  


Ten post edytował wookieb 13.01.2010, 16:41:09


--------------------
Go to the top of the page
+Quote Post
SN@JPER^
post 13.01.2010, 16:48:47
Post #3





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


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. ////////////////////////////////////////////////////////////////////
Go to the top of the page
+Quote Post
marcio
post 13.01.2010, 17:51:00
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Po to zeby wartosc wyswietlic/pobrac bez niego takie cos:

  1. $obiekt -> polePrivate;


Zwroci blad tak samo z protected.



--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
starach
post 13.01.2010, 18:50:57
Post #5





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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.

Ten post edytował orglee 13.01.2010, 18:57:59
Go to the top of the page
+Quote Post
SN@JPER^
post 14.01.2010, 16:48:28
Post #6





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


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?
Go to the top of the page
+Quote Post
darko
post 14.01.2010, 16:53:12
Post #7





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
thek
post 14.01.2010, 21:55:45
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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

Ten post edytował thek 14.01.2010, 22:02:49


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Crozin
post 14.01.2010, 22:53:33
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
thek
post 14.01.2010, 23:54:12
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Crozin
post 15.01.2010, 00:00:03
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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 :]).
Go to the top of the page
+Quote Post
thek
post 15.01.2010, 00:08:10
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 15.01.2010, 00:08:34


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
darko
post 15.01.2010, 00:44:42
Post #13





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Modyfikatory dostępu/specyfikatory w Javie, które mnie najbardziej zaintrygowały to: native oraz synchronized


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Crozin
post 15.01.2010, 01:15:41
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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
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: 25.04.2024 - 07:27