Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dokładne znaczenie i rozumienie static
Forum PHP.pl > Forum > PHP > Object-oriented programming
szubi95
Hey wszystkim! wink.gif

Ostatnio napotkałem na mały problem, a raczej na definicję, którą podyktował nauczyciel na lekcji ^^

Cytat
static - statyczna - składowe statyczne są wspólne dla wszystkich obiektów danej klasy. Jeśli słowem tym zostanie poprzedzona definicja metody lub zmiennej istnieje nawet wtedy, gdy nie został utworzony żaden obiekt danej klasy


Uważam, że składowe statyczne należą tak naprawdę do klasy, a nie do obiektów, a przynajmniej, to właśnie z klasą są bezpośrednio, ściśle związane. Może źle rozumiem(proszę o naprowadzenie), ale przecież wywołanie składowej statycznej z poziomu obiektu jest po prostu głupie(przynajmniej z mojego punktu widzenia). Przecież wywołując składową z poziomu klasy możemy zmienić gdzieś jej wartość, co prowadzi do patologii kiedy będzie ona użyta z poziomu obiektu(mam na myśli, że jedno będzie w jednym miejscu, a drugie w innym i może spowodować błąd). W php o ile się orientuję odwołanie się w taki sposób:

  1. public static zmienna;
  2.  
  3. $a = new Pies();
  4. $a->zmienna;


jest niemożliwe(może czegoś nie wiem), natomiast w javie to działa, ale w eclipsie mam wykrzykniki i podpowiedzi, żeby zmienić z poziomu obiektu na poziom klasy lub też zastosować specjalny "kruczek", czy jakąś tam instrukcję, żeby było poprawnie...

Czy mógłby mi ktoś podpowiedzieć, powiedzieć jak jest dokładnie? Może to są szczegóły(w sumie bez problemów używam tych rzeczy, ale jednak chodzi mi o sposób dokładnego zrozumienia), ale dla mnie imo ważne wink.gif

Z góry dziękuję i pozdrawiam,
szubi
aniolekx
programista zrobi tyle na ile mu pozwolisz projektując klasę


  1. class Pies
  2. {
  3. private static $zmienna;
  4. public static $zmienna2;
  5.  
  6. public function setZmienna($value)
  7. {
  8. self::$zmienna = $value;
  9. }
  10.  
  11. public function getZmienna()
  12. {
  13. return self::$zmienna;
  14. }
  15.  
  16. public static function test()
  17. {
  18. return self::$zmienna;
  19. }
  20. }
  21.  
  22. $pies = new Pies();
  23. $pies->setZmienna('bark!');
  24.  
  25. echo $pies->getZmienna();
  26. echo $pies->test();
  27. echo Pies::test();
  28.  
  29. /* Error: Cannot access private property */
  30. echo Pies::$zmienna;
  31.  
  32. /* Error: Accessing static property Pies::$zmienna as non static */
  33. $pies->zmienna2;
Crozin
1. Twoje rozumowanie jest poprawne: elementy statyczne należą do klasy, nie obiektów. To, że są one "wspólne dla wszystkich obiektów danej klasy" to jedynie efekt uboczny.
2. Wywoływanie metod/właściwości statycznych przez obiekty, tj.: $obj->metodaStatyczna() jest głupie, pozbawione sensu i z niewiadomych powodów jednak dopuszczalne - ale to już uroki PHP. wink.gif
szubi95
No tak, to jest oczywiste. Tak samo jest przecież w singletonie, implementacji wzorca proxy przy łączeniu z bazą jak i każdym innym wykorzystaniu, bo tak jak wspomniałeś to ode mnie zależy jak zaprojektuję klasę. To co napisałeś, to zyskujemy szybkość zmiennej statycznej i prywatność składowej, ok. Mi nie chodzi o zastosowanie odnośnie kodu, a bezpośrednie zrozumienie definicji, ponieważ mam swój pogląd, który przedstawiłem powyżej i nagle ktoś wpaja mi inny bez żadnej argumentacji. Dlatego moje pytanko bardziej tyczy się sposobu rozumienia, nie bezpośredniego użycia w kodzie wink.gif

Tak, czy siak dziękuję za zainteresowanie tematem aniolekx wink.gif

Bardzo Ci Crozin dziękuję. O taką odpowiedź mi właśnie chodziło wink.gif

Pozdrawiam,
szubi
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-2024 Invision Power Services, Inc.