![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 361 Pomógł: 22 Dołączył: 10.02.2015 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 82 Pomógł: 22 Dołączył: 20.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
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
$ cat bb.php
$ 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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 06:11 |