Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Elementy statyczne
Forum PHP.pl > Forum > Przedszkole
Fred1485
Witam,

Pytanie jest bardziej na myślenie niż działanie, dotyczy metod i elementów statycznych. Definicji jest trochę, z grubsza wiem o co chodzi, ale nie natrafiłem jeszcze na jakiś logiczny przykład użycia static w klasie (oprócz wszędzie wymienianego liczenia instancji klasy, gdzie to rzeczywiście może się przydać). Czy programując w OOP jeśli używacie takich elementów, w jakim celu je wykorzystujecie?
KsaR
Ladnie wyglada ^^.

Klasa::metoda('wartosc');

Poza tym są szybsze od zwyklych metod biggrin.gif.

Nie mam zadnego praktycznego przykładu.
Pozatym nie tworzy obiektu tylko bezposrednio sie odwoluje do danego elementu klasy, więc w takich przypadkach może być przydatne.

Także jest przydatne gdy nie musisz uzywac $this bo o ile czegos nie pomylilem, w np. Statycznych metodach $this jest niedostepne.
Fred1485
no szczerze mówiąc to co napisałeś to już wiem biggrin.gif
Może wypowie się ktoś kto na co dzień ma z OOP styczność wink.gif
blahy
Metody statyczne moga byc uzyte do:
1. przechowywania globalnego stanu aplikacji, np. State::$debug = true, nie polecam

2. singletonow - wymuszanie tworzenia i uzywania jednej instancji obiektu danej klasy ( https://github.com/symfony/symfony/blob/2ae...sionGuesser.php ): ::getInstance() - nie polecam, ale bez static nie da sie tego zrobic.

3. tworzenia klas typu Utility, zbioru funkcji ukrytych pod wspolnym namespace, tez nie polecam

4. cacheowania wynikow dzialania metod, np. https://github.com/symfony/symfony/blob/2ae...oneType.php#L63.

Metoda TimezoneType::getTimezones uzywa statycznej tablicy $timezones. Po jednokrotnym wywolaniu tej metody kosztowna czasowo operacja bedzie przechowywana w tej zmiennej. Kazde kolejne wywolanie metody zwroci wczesniej utworzony wynik.
Co wiecej utworzenie obiektu tej klasy, lub kolejnego obiektu i wywolanie na nim tej metody tez nie bedzie prowadzic do ponownego generowania tej listy. Oczywiscie metody statyczne powinny byc bezstanowe. Wynik ich wywolania powinien byc zalezny tylko od parametrow wejsciowych a nie stanu obiektu.

5. optymalizacja pamieciowa. Atrybuty obiektow sluza do przechowywania danych. Jesli te dane nie zmieniaja sie (jak imie obiektu Osoba), mozna zadeklarowac je jako statyczne, np: https://github.com/symfony/symfony/blob/2ae...sformer.php#L20. Atrybut protected static $formats jest niezmienny, lub zmienny w stosunku do klasy, a nie obiektu. Utworzenie wielu instancji tego obiektu nie bedzie zajmowac pamieci na identyczny atrybut w wielu obiektach.

$ cat aa.php
  1. <?php
  2. class A {
  3. private $a = [1,2,3,4,5,6,7,8,9,10];
  4. }
  5.  
  6. $c = [];
  7. for($i=0;$i<1000000;++$i) {
  8. $c[] = new A();
  9. }
  10.  
  11. echo memory_get_peak_usage();

$ cat bb.php
  1. <?php
  2. class A {
  3. private static $a = [1,2,3,4,5,6,7,8,9,10];
  4. }
  5.  
  6. $c = [];
  7. for($i=0;$i<1000000;++$i) {
  8. $c[] = new A();
  9. }
  10.  
  11. echo memory_get_peak_usage();

$ php aa.php
291681216
$ php bb.php
259669560

Przy wolaniu metod wielu tysiecy obiektow kilkaset lub wiecej razy w ciagu pojedynczego requestu zaczyna to miec znaczenie.

6. Utrudnieniu sobie zycia przy pisaniu unit testow.
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.