Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Elementy statyczne
Fred1485
post 8.07.2015, 17:12:08
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?


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
KsaR
post 8.07.2015, 17:44:29
Post #2





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Ksar 8.07.2015, 17:46:47


--------------------
Go to the top of the page
+Quote Post
Fred1485
post 8.07.2015, 18:23:11
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


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


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
blahy
post 9.07.2015, 22:46:37
Post #4





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
  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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 10:34