Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: metody statyczne czy instancyjnye
Forum PHP.pl > Forum > PHP > Object-oriented programming
Rozpalacz
Witam,

tak się zastanawiam jaka jest wyższość klas/metod instancyjnych nad statycznymi. Czy ma ktoś dobry przykład że lepiej zastosować gdzieś klasę/metodę instancyjną niż statyczną? Bo chyba wszystko można zrobić statycznie...
Crozin
Wtedy taki kod jest kompletnie bez sensu, bo klasa staje się niczym innym jak synonimem dla przestrzeni nazw. Nie da się utworzyć dwóch obiektów o różnych wartościach.

Generalnie w OOP trzeba się dosyć mocno nagłowić by znaleźć uzasadniony przypadek dla użycia statycznych metod/właściwości.
MESSIAH :)
Metoda statyczna
  1. <?php
  2. Class Static0 {
  3.  
  4. public static $counter = 0;
  5.  
  6. public static function incrByTwo()
  7. {
  8. self::$counter = self::$counter + 2;
  9. }
  10. }
  11.  
  12. Class Static1 extends Static0 {
  13.  
  14. public static function incrByOne()
  15. {
  16. self::$counter = self::$counter + 1;
  17. }
  18.  
  19. public static function incrByTwo()
  20. {
  21. parent::incrByTwo();
  22. }
  23. }
  24.  
  25. $time_start = microtime(true);
  26. for($i=0;$i<100000;$i++) {
  27. Static1::incrByOne();
  28. Static1::incrByTwo();
  29. }
  30.  
  31. echo Static0::$counter ;
  32. $time_end = microtime(true);
  33. $time1 = $time_end - $time_start;
  34. ?>
  35. Total execution time is <?php echo $time1;?>
  36. Used memory: <?php echo memory_get_usage();?>

Metoda non-static:
  1. <?php
  2.  
  3. Class Static0 {
  4.  
  5. public $counter = 0;
  6.  
  7. public function incrByTwo()
  8. {
  9. $this->counter = $this->counter + 2;
  10. }
  11. }
  12.  
  13. Class Static1 extends Static0 {
  14.  
  15. public function incrByOne()
  16. {
  17. $this->counter = $this->counter + 1;
  18. }
  19.  
  20. public function incrByTwo()
  21. {
  22. parent::incrByTwo();
  23. }
  24. }
  25.  
  26. $time_start = microtime(true);
  27. $obj = new Static1();
  28. for($i=0;$i<100000;$i++) {
  29. $obj->incrByOne();
  30. $obj->incrByTwo();
  31. }
  32.  
  33. echo $obj->counter ;
  34.  
  35. $time_end = microtime(true);
  36. $time1 = $time_end - $time_start;
  37. ?>
  38.  
  39. Total execution time is <?php echo $time1;?>
  40. Used memory: <?php echo memory_get_usage();?>

Jak widać w tym teście metoda statyczna jest szybsza. Ja jestem zwolennikiem tej metody dlatego ją stosuje.
Pyton_000
Polecam: http://webmastah.pl/php-go-home-static-youre-drunk/
MESSIAH :)
Na tej stronie jak sam tytuł mówi autor pisał artykuł pod wpływem alkoholu. Twierdzi, że static powinien umrzeć - jedno stwierdzenie się nasuwa. Jeśli autor jest zawodowym znawca i profesjonalnym php'owcem niech przebuduje wszystkie frameworki, cms i tym podobne i niech pousuwa static. Skoro frameworki używają static to chyba nie w celu pogorszenia jakości skryptu.
Pyton_000
O jakich static'ach mówisz? O Fasadach w Laravelu? O innych ciekawych tworach które mają tylko ułatwiać życie aby nie tworzyć sztucznie dostępu do czegoś co już jest?

Podaj przykłady dlaczego Static jest lepsze od non-static. Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie. Więc ihmo wychodzi na 0.
MESSIAH :)
http://alembic-dev.com/php-static-vs-instance-benchmark/

Dziwne bo w testach static wykazuje mniejsze zużycie pamięci o około 1%
Cytat
Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie

Jak mam to rozumieć? Jeśli wprowadzę klasę z wartościami statycznymi wtedy zajmują one miejsce w RAM? A jeśli zastosuje non-static to wtedy wartości zostaja umieszczone w RAM i mają wielkość 0b? Dziwne bo według mnie każdy znak zajmuje miejsce w RAM.
by_ikar
Cytat(MESSIAH :) @ 13.01.2015, 14:47:30 ) *
Jak widać w tym teście metoda statyczna jest szybsza. Ja jestem zwolennikiem tej metody dlatego ją stosuje.


tzn szybsza w czym? Twój test u mnie wygląda tak: https://dl.dropboxusercontent.com/u/3624937...-non-static.png

Nie bardzo widzę kolosalną różnicę między szybkością, nawet jeżeli non static wypada lepiej.

To że ludzie jeżdżą pasatem, wcale nie znaczy że lamborghini aventador jest gorszym samochodem. Po prostu pasat jest tańszy. Podobnie jest IMO z static, dużo łatwiej wykorzystać singletona, niż jakoś sensownie rozplanować aplikacje która będzie wykorzystywać IoC/DI.

A powiedz mi jeszcze, co jest łatwiej testować?
MESSIAH :)
Cytat(Pyton_000 @ 13.01.2015, 15:53:09 ) *
O jakich static'ach mówisz? O Fasadach w Laravelu? O innych ciekawych tworach które mają tylko ułatwiać życie aby nie tworzyć sztucznie dostępu do czegoś co już jest?

Podaj przykłady dlaczego Static jest lepsze od non-static. Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie. Więc ihmo wychodzi na 0.

Kolega chyba źle wkleił kody które podałem lub ma stara wersję PHP. Przeprowadziłem jeszcze raz testy i zwiększyłem liczbe pętli oto wyniki:
Static:
9000000 Total execution time is 5.2813019752502 Used memory: 130240
NoStatic:
9000000 Total execution time is 5.7793300151825 Used memory: 130528
Jak więc wydzimi static jest szybsze i nie pożera pamięci. Jesli już piszemy o samochodach to nie marka jest ważna a prędkość i pojemność. Kto by nie chciał samochodu 10 osobowego z ogromnym bagażnikiem, który osiąga 100km w 0,5s? Jeśli juz porównujesz ststic vs nostatic do marka vs marka wniosek nasuwa sie tylko jeden = kto używa nostatic woli markę a kto używa static woli prędkość i pojemność. Dziękuję, do widzenia.
piotrooo89
Przepraszam z góry z kolokwializmy.
Pytanie jest w stylu "robić kupę" czy "sikać", nie da sie tego jednoznacznie określić poprostu zależy od potrzeby.

@MESSIAH z całym szacunkiem ale Twoje testy nie dowodzą absolutnie nic. Wydaje mi sie że dalej jesteś w erze Athlona 1.7 i jak reprezentujesz rekord z bazy np. poprzez ActiveRecord pattern ja sobie nie umiem wyobrazić tego, no chyba że jak to w środowisku programistów PHP się przyjęło stosujesz AOP (array oriented programming), sorry ale może lepiej właśnie czasem pomyśleć o patternach i dobrych praktykach niż mierzyć wszystko co do nanosekundy bo później w światku IT programiści PHP postrzegani są jak "lewary".
by_ikar
Cytat(MESSIAH :) @ 13.01.2015, 16:59:08 ) *
Kolega chyba źle wkleił kody które podałem lub ma stara wersję PHP. Przeprowadziłem jeszcze raz testy i zwiększyłem liczbe pętli oto wyniki:
Static:
9000000 Total execution time is 5.2813019752502 Used memory: 130240
NoStatic:
9000000 Total execution time is 5.7793300151825 Used memory: 130528
Jak więc wydzimi static jest szybsze i nie pożera pamięci. Jesli już piszemy o samochodach to nie marka jest ważna a prędkość i pojemność. Kto by nie chciał samochodu 10 osobowego z ogromnym bagażnikiem, który osiąga 100km w 0,5s? Jeśli juz porównujesz ststic vs nostatic do marka vs marka wniosek nasuwa sie tylko jeden = kto używa nostatic woli markę a kto używa static woli prędkość i pojemność. Dziękuję, do widzenia.


Wkleić źle kod, tak żeby zużywał mniej pamięci? Ciekawe wnioski ;)

Powiadasz że 288 bajtów jest wyciekiem pamięci, tak poważnym, aby utrudniać sobie testy jednostkowe? Jak wygląda u ciebie testowanie takich statycznych aplikacji, masz na to jakiś złoty środek, czy testów nie robisz wcale ?
piotrooo89
@by_ikar akurat testy statycznych metod są proste możesz pokryć cały kod. 288 to większe zużycie - nie wyciek smile.gif
Dejmien_85
Cytat(piotrooo89 @ 13.01.2015, 21:09:55 ) *
@by_ikar akurat testy statycznych metod są proste możesz pokryć cały kod.


Normalnie mam ochotę wrzucić to na demotywatory (albo kwejka). wink.gif

Od kiedy to statyczne twory, które posiadają jeden stan i są dostępne GLOBALNIE są łatwe do testowania?

Oj, kolego, chyba jeszcze nie słuchałeś opowieści starych rzemieślników mówiących na prawo i lewo, że ze "statyką" to trzeba ostrożnie postępować? wink.gif

Czyżbyś zapomniał o tym, że jeśli są dostępne globalnie, to z każdego miejsca możesz zmienić ich stan, a wtedy automatycznie zmienia się on
we wszystkich miejscach aplikacji i może wywołać efekty uboczne we wszystkich tych miejscach?

Ja się zgodzę, że jakiś mały helperek, typu hashPassword(), który zwraca hasha jest łatwy do testowania. Ale jeśli
w metodzie statycznej znajdzie się choć troszkę logiki, albo jakieś zmienne, wtedy powiedzieć mogę jedynie: "Z Bogiem, chłopcze - może pomoże". ; )

Disclaimer: Metody statyczne mają swoje dobre strony, zdarza mi się ich używać.

Cytat(Pyton_000 @ 13.01.2015, 14:54:58 ) *


Nie ma to jak przedstawić używanie grzebienia na głowie łysego i powiedzieć, że grzebień jest złym narzędziem do czesania łysych... Takie coś zrobić może jedynie Geniusz! ; )
piotrooo89
Cytat(Dejmien_85 @ 15.01.2015, 15:57:30 ) *
Ja się zgodzę, że jakiś mały helperek, typu hashPassword(), który zwraca hasha jest łatwy do testowania. Ale jeśli
w metodzie statycznej znajdzie się choć troszkę logiki, albo jakieś zmienne, wtedy powiedzieć mogę jedynie: "Z Bogiem, chłopcze - może pomoże". ; )


Zgadzam się w 100%, o właśnie takie testy mi chodziło, prosty metod bibliotecznych, fabryk. Testy jednostkowe dla takich rzeczy są proste. Nigdy nie stosowałem logiki w statycznych polach/metodach więc nawet nie pomyślałem o czymś takim.
nrm
Kontynuując temat zapalny (zawsze z tego jakieś hejty się rodzą biggrin.gif ) jakim są metody statyczne: http://webmastah.pl/jak-programowac-obiekt...ach-ten-static/
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.