Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP set i get
Forum PHP.pl > Forum > PHP
Fluke
Witam ponownie. Mam pytanie odnośnie OOP. Czy każdą funkcje w klasie która ma przypisać wartość rozpoczynamy od set a która ma wyświetlić(przesłać) get (oczywiście get będzie public a set np private albo protected).
Np:
  1. <?php
  2. class Klasa
  3. {
  4. var $_zmianna;
  5.  
  6. private function setZmienna($a)
  7. {
  8. //instrukcje.
  9. ...
  10. $this->_zmienna = $a;
  11. }
  12.  
  13. public function getZmienna($a)
  14. {
  15. $his->setZmienna($a);
  16. return $this->_zmienna;
  17. }
  18. }
  19. ?>


Bo nie bardzo rozumiem czemu są takie wymogi set i get, a nie chcę robić tego na pałe.
Pozdrawiam.
konrados
To nie jest wymóg, tak się po prostu przyjęło (mam na myśli nazewnictwo, bo sama koncepcja funkcji typu pobierz/ustaw jest tak stara jak samo OOP).

Cytat
set np private albo protected


A czemuż to?

I czemu w getZmienna wywołujesz

$his->setZmienna($a); ?
luck
Taka jest konwencja nazewnictwa w PHP, choć teoretycznie metody ustawiające i odczytujące mogą przyjmować dowolne nazwy. Dla porównania w Javie, takie np. JSF przy każdym odwołanie do jakiegokolwiek komponentu zakłada odczyt i zapis pól jego klasy przy użyciu właśnie metod "get" i "set". W PHP nie jest to wymóg, ale warto trzymać się określonych standardów, no i takie nazewnictwo jest jak najbardziej logiczne, jeśli wszystkim metodom w kodzie nadajemy nazwy pochodzące z jęz. angielskiego.
Mimo wszystko trochę źle to interpretujesz. W get nie ustawiasz zmiennej, a tylko ją zwracasz. Metoda get powinna być wywoływana bez żadnych parametrów.
Fluke
No bo np jak wykorzystujemy klasę to setZmienna jest private więc nie możemy jej użyć po za klasą.
Np:
  1. <?php
  2. $klasa = new Klasa;
  3. $a = 4;
  4.  
  5. echo $klasa->getZmienna($a);
  6. ?>

I np getZmienna to tylko pobiera zmienną $this->_zmienna ale w metodzie setZmienna($a) np. robimy z nią przerużne modyfikacje. I gdy chcemy wyświetlić zmienną to uzywamy tylko funkcji getZmienna.
Nie wiem czy to dobrze rozumiem, więc proszę o pomoc.

Z góry dziękuję i pozdrawiam.

luck, to jak mamy zewnętrzną zmienną do przekazania wewnątrz klasy to jak to się odwołuje? Bo przez $klasa->setZmienna($a) będzie robić modyfikacje na tej zmiennej ale jej nie będzie wyświetlać.
Crozin
Źle rozumiesz: http://en.wikipedia.org/wiki/Mutator_method
luck
Cytat(Fluke @ 15.11.2010, 20:58:24 ) *
No bo np jak wykorzystujemy klasę to setZmienna jest private więc nie możemy jej użyć po za klasą.
(...)
luck, to jak mamy zewnętrzną zmienną do przekazania wewnątrz klasy to jak to się odwołuje? Bo przez $klasa->setZmienna($a) będzie robić modyfikacje na tej zmiennej ale jej nie będzie wyświetlać.

Metody get i set mają być publiczne. Tylko samo pole klasy, którego one dotyczą deklarujesz jako private lub protected.
Co do drugiej części pytania: przecież z założenia setZmienna ma tej zmiennej tylko przypisać konkretną wartość, nie wyświetlać ją. Do wyświetlenia stwórz sobie osobną metodę, np. showZmienna.
Fluke
Czyli set ma nam zwracać daną zmienną a get co w tedy robi?

Mamy klasę ABC i 2 metody: 1) sprawdza zmienną czy jest poprawna, 2) dodaje do bazy.

  1. <?php
  2. class ABC
  3. {
  4. public function sprawdz($a)
  5. {
  6. if($a == 'abc')
  7. return true;
  8. else
  9. return false;
  10. }
  11.  
  12. public function dodaj($a)
  13. {
  14. if($this->sprawdz)
  15. $query = mysql_query('bla');
  16. }
  17. }
  18.  
  19. $klasa = new ABC;
  20. $a = 'abc';
  21. $klasa-> i która metoda($a);
  22. ?>


i która nazwa set a która get?
luck
Prościej już nie umiem tego pokazać, sorry:
  1. class Test{
  2. private $a;
  3.  
  4. public function setA($a) {
  5. $this->a = $a;
  6. }
  7.  
  8. public function getA() {
  9. return $this->a;
  10. }
  11. }
Fluke
No ja rozumiem że jak chcemy ustawić daną zmienną to set a żeby zwrócić to get ale w przypadku gdy metoda ma np: stworzyć nowy rekord w bazie to dajemy set albo get czy nazwę jaką chcemy. Chodzi mi o to czy wszystkie metody muszą zaczynać się od set lub get w zależności co dana metoda ma robić.
Sorry ale dręczy mnie to i nie mogę za bardzo pojąć a chcę stosować się do standardów i przede wszystkim zrozumieć to.
konrados
Cytat
Chodzi mi o to czy wszystkie metody muszą zaczynać się od set lub get w zależności co dana metoda ma robić.


Oczywiście, że nie. Tylko funkcje, których podstawowym celem jest ustawienie/zwrócenie zmiennej.
d3ut3r
Jak chcesz stworzyć nowy rekord, to robisz metodę insert na przykład, metody nie muszą zaczynać się od set i get ale tak się przyjęło i w miarę możliwości powinieneś się do tego przyzwyczaić. Jeżeli na przykład pobierasz listę aut z bazy danych to zrób metodę getCars, itd. Ułatwi Ci to powrót do projektu za tydzień, także inny programista który być może kiedyś siądzie nad twoim kodem nie będzie tracił czasu na rozważanie, "co autor miał na myśli"
luck
Cytat(Fluke @ 15.11.2010, 21:24:35 ) *
Chodzi mi o to czy wszystkie metody muszą zaczynać się od set lub get w zależności co dana metoda ma robić.
Sorry ale dręczy mnie to i nie mogę za bardzo pojąć a chcę stosować się do standardów i przede wszystkim zrozumieć to.
Napiszę raz jeszcze: niczego nie musisz, możesz nazywać tak jak będzie Ci wygodnie. Ponazywaj sobie je ustawA i pobierzA, a wszystko nadal będzie działać. Rób tak, żebyś po paru tygodniach czytając samą nazwę metody mógł łatwo stwierdzić do czego ona służy - ot cała filozofia.
Fluke
luck, ja wiem że będzie chodzić. Tutaj akurat mi chodzi żeby stosować się do standardów i lepiej nazywać metody. Mam pytanie jeszcze dla chętnych: czy ktoś może podesłać solidną lekturę, którą sam przczytał i korzystał, właśnie skierowaną ku OOP(tylko nie opdowiedź: google). I jeszcze jedno: Czy OOP wymaga stosowanie interfejsów, czy są one zbędne, i jak by ktoś mógł wytłumaczyć do czego je stosować bo według mnie w ogóle nie są potrzebne(a za pewne się mylę).

Z góry dziękuję za wszystkie wyczerpujące odpowiedzi smile.gif
Crozin
W PHP problem interfejsów da się dosyć mocno zbagatelizować bo nie są one potrzebne do działania skryptu samego w sobie. Nie mniej jednak w przypadku, gdy chcemy sprawdzić czy "coś jest czymś" w celu wykonania jakiś dedykowanych operacji na obiekcie/ach ciężko się bez nich obejść.
Mephistofeles
Są niezbędne gdy chcesz zaimplementować obsługę ArrayAccess itp.
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.