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