Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: public czy public static
Forum PHP.pl > Forum > PHP > Object-oriented programming
koala
Jak w temacie, co "lepsze"

public function abc()
{}

czy

public static function abc()
{}
NuLL
MEGAROTFL biggrin.gif Zaliczylem dywan biggrin.gif

A Ty wiesz wogole jaka jest roznica czy pomiedzy z metodami ze static i bez questionmark.gif snitch.gif Czy to chodzi co ladniej wyglada questionmark.gif
koala
Myślę, a właściwie to jestem pewien, że powinieneś sobie jeszcze dość długo poleżeć na tym dywanie, dobrze by Ci to zrobiło.
Drugiego bardziej złośliwego i nie umiejącego odpowiadać na pytania a przy okazji przechwalającego się co to ja nie umiem to na tym forum nie ma.
Wyobraź sobie że wiem.

Wiesz co to jest :
Dynamic Static Method
Declared Static Method
envp
yhym chyba nie za bardzo wiesz dry.gif

Statycznych metod uzywamy wtedy, kiedy nie potrzeba tworzyć instacji obiektu.
odwołujemy się do nich przez "::"
  1. <?php
  2. Klasa::funkcja_statyczna();
  3. ?>


Drugiej chyba wiadomo, bo książkowy przypadek metody w obiekcie...

Ps. Przecież to jest wszystko uwarunkowane od okolicznośći, skoro nadal uważasz ze to jest w 100% zamienne i zależy od woli programisty, to pokaż jak stworzysz singletona bez static...
mike
~koala Twoje pytanie można porównać do: "Co jest lepsze? Klawiatura czy myszka?"

Przecież obie konstrukcje do czego innego służą, co innego oznaczają i nie stosuje się ich wymiennie.

Powiedz co chcesz osiągnąć To Ci powiemy co w Twojej sytuacji jest bardziej odpowiednie.
W żadnym razie nie ocenia się tego w kategoriach lepsze/gorsze.

Doczytaj sobie manuala bo poważnie to jest śmieszne tongue.gif
TomASS
Szanowny kolego koala, funkcja składowa static jest właściwością klasy, nie obiektu, podobnie jak zmienna static. A więc wynika z tego, że aby wywołać "normalną" zmienną klasy, musisz mieć najpierw utworzony obiekt:
  1. <?php
  2. class New_obj{
  3. public function kotek(){
  4. echo 'Wlazł kotek na płotek!';
  5. }
  6. }
  7.  
  8. $obj = new New_obj();
  9. $obj->kotek();
  10. ?>

Zmienna statyczna (tak samo jak funkcja) to pewne miejsce w pamięci komputera i jest związane z klasą, nie z obiektem, co skutkuje tym, że nie musi istnieć egzemplarz klasy:

  1. <?php
  2. class New_obj{
  3. public static function kotek(){
  4. echo 'Wlazł kotek na płotek!';
  5. }
  6. }
  7.  
  8. New_obj::kotek();
  9. ?>


I odnosisz się do tej funkcji/zmiennej poprzez operator zakresu '::'.


Także Twoje pytanie co jest lepsze nie za bardzo miało sens, powinieneś je bardziej sprecyzować.
NuLL nie jest złośliwy, wielokrotnie pomaga ludziom, irytują go niemądre pytania (podobnie jak mnie)

@envp : przecież nie każdy musi korzystać z sigletona tongue.gif

BTW: A dlaczego koledzy envp i Null używają słowa "metoda" ? tongue.gif zamiast np. funkcja członkowska tongue.gif
envp
Cytat
@envp : przecież nie każdy musi korzystać z sigletona tongue.gif

BTW: A dlaczego koledzy envp i Null używają słowa "metoda" ? tongue.gif zamiast np. funkcja członkowska tongue.gif

@TomASS Nie każdy musi korzystać z singletona, bo jak wiadomo obiekty możemy przekazywać przez referencję, ale to już jest chyba w pełni zamienne(?) Poza tym chyba singleton jest wygodny smile.gif

funkcja członkowska ? blinksmiley.gif

Pozdrawiam, Kamil
Cysiaczek
@envp - hmm... w zasadzie nazwanie konstrukcji 'static function' metodą jest mało precyzyjne.
Metody w sensie działania, akcji - posiada obiekt. Powiedzenie funkcja statyczna klasy jest chyba dobre, ale dlaczego funkcja członkowska? Możesz to rozwinąć TomASS?

Pozdrawiam.
TomASS
Cytat
Poza tym chyba singleton jest wygodny

Pewnie że jest smile.gif

Co do funkcji członkowskich (składowych)

Chodziło mi o ironię tongue.gif Oczywiście każdy wie co oznacza metoda. Nie chcę się mądrować, ani puszyć tongue.gif
Przeczytałem to po prostu w jednej mądrej książce.

Słowo funkcja składowa (członkowska) pochodzi z C++, gdzie w 700 stronnicowym opisie standardu zawsze używany jest termin "member function". Słowo "metoda", w tym znaczeniu, pochodzi ze starszych języków, jej zwolennicy argumentują takie nazewnictwo, że funkcje należące do klasy/obiektu to tak jakby sposób postępowania (metoda) z obiektem przez użytkownika. Ale w takim razie prywatne "member function" jak nazwać? Przecież nie są to metody postępowania z obiektem przez użytkownika klasy.
koala
Drodzy koledzy
po pierwsze - zauważcie że nie napisałem - lepsze tylko "lepsze" - chciałem sprowokować Was do takiej właśnie dyskusji. Jestem pewien, że sporo osób (początkujących przedewszystkim) będzie Wam za nią wdzięcznych.
po drugie - spójżcie na własne posty a na post NULL-a, z których można się czegoś dowiedzieć ?
po trzecie - zaglądam i do manuala i do "php i MySQL - Tworzenie stron WWW - Vademecum profesjonalisty"
Skąd takie pytanie ? Trafiłem wczoraj na http://ilia.ws/talks.php i przejżałem m.in. http://ilia.ws/files/zend_performance.pdf i przetestowałem ten przykład :
  1. <?php
  2. class bench {
  3. public function a() { return 1; }
  4. public static function b() { return 1; }
  5. }
  6. $s = microtime(1);
  7. for ($i = 0; $i < 100000; $i++) bench::a();
  8. $e = microtime(1);
  9. echo "Dynamic Static Method: ".($e - $s)."n";
  10. $s = microtime(1);
  11. for ($i = 0; $i < 100000; $i++) bench::b();
  12. $e = microtime(1);
  13. echo "Declared Static Method: ".($e - $s)."n";
  14. ?>

Sądzę, że wszyscy którzy o tym nie wiedzieli a uruchomią sobie ten przykład zaczną od teraz zastanawiać się czy akurat u nich co niektórych metod nie dałoby się zrobić statycznych. No cóż 300-400% szybciej, chyba jest nad czym się zastanawiać ?
mike
No nie no jak takie coś wypisujesz to się nie dziwię, że takie czasy masz.
Napisz to po ludzku i potem zmierz czasy tongue.gif

  1. <?php
  2.  
  3. class bench {
  4. public function a() { return 1; }
  5. public static function b() { return 1; }
  6. }
  7.  
  8. $ob = new bench();
  9.  
  10. $s = microtime(1);
  11.  
  12. for ($i = 0; $i < 100000; $i++) $ob->a();
  13. //for ($i = 0; $i < 100000; $i++) bench::a();
  14.  
  15. $e = microtime(1);
  16.  
  17. echo "Dynamic Static Method: ".($e - $s)."n";
  18.  
  19. $s = microtime(1);
  20.  
  21. for ($i = 0; $i < 100000; $i++) bench::b();
  22.  
  23. $e = microtime(1);
  24.  
  25. echo "Declared Static Method: ".($e - $s)."n";
  26.  
  27. ?>
nospor
Cytat
Sądzę, że wszyscy którzy o tym nie wiedzieli a uruchomią sobie ten przykład zaczną od teraz zastanawiać się czy akurat u nich co niektórych metod nie dałoby się zrobić statycznych.

smile.gif
Teraz ja podam przyklad:
mam w domu dwa mlotki: jeden prawdziwy, drugi zabawka (plastikowy). Teraz zabieram sie do wbijania prawdziwego gwoździa do prawdziwej deski. No i mierze czas, ktorym mlotkiem bedzie szybciej. Ciekawe jakie beda wyniki smile.gif
Tak samo u ciebie. porownujesz czasy dwoch rzeczy, ktore sa stworzone zupelnie do innych rzeczy. Jak cos ma byc static, to sie mowi ze to ma byc static. To chyba logiczne. Jak cos ma nie byc static, to sie tego nie wywoluje jako static i juz.

Jedyne czym mnie zszokowales w tym przykladzie to fakt, ze php pozwala na wywolywanie nie statycznych metod jako statyczne i to bez nawet zadnego NOTICE.
koala
Jeszcze raz :
to nie mój przykład tylko autora PDF-a.
Wydawało mi się że Ilja Alshanetsky to facet który o php coś wie ? Może się mylę ? Może ktoś mnie wyprowadzi z błędu ?
Cysiaczek
No właśnie mnie też to zszokowało. Pozostałość po php 4 jak sądzę... Choć wydaje się, że php sprawdza jedynie, czy funkcja zawiera jakieś odwołania w kontekście obiektu (przy deklaracji) i dopiero wtedy wyrzuca błąd. Mogę się jednak mylić.
nospor
ale czy ja mowie ze to zly facet? Ja mowie to co on przy pomocy tego przykladu:
jak cos ma byc static to masz to deklarowac jako static i juz. to logiczne, nawet dla Puchatka smile.gif

tak wiec twoje pytanie:
Cytat
co "lepsze"
jest bez sensu, jak juz ci wyjasniono. wszystko zalezy od tego jak dana funckaj ma byc uzywana
tak jak z moimi mlotkami: zaden nie jest lepszy, zalezy od uzycia. jak bede wbijal prawdziwe gwoździe to wezme prawdziwy mlotek, jak bede sie bawil z corką w klocki, to wezme zabawkowy mlotek
mike
~koala przede wszystkim jak chcesz wywołać dyskusję na jakiś temat to nie zadawaj takich pytań bez słowa wyjaśnienia.
Skąd ktoś co Ci odpowiada ma wiedzieć, że Ty wspaniałomyślnie poruszasz nasze szare komórki na potrzeby ludzkości.

Ilja Alshanetsky oczywiście jest autorytetem jeśli chodzi o php, ale nie wszystko co pisze to dogmaty.

Kolejna sprawa że wyciąłeś ten fragment z kontekstu.
A tam było napisane: Always declare your static methods!

W tym przypadku przesłanie jest jasne.
php jest ułomne i pozwala Ci na głupoty ale tego nie rób!
Zawsze deklaruj metody jako statyczne jeśli będziesz chciał/potrzebował odwoływać się do nich w statyczny sposób, bo jak tego nie zrobisz to będzie lipa tongue.gif

Nie rozumiem co w tym dziwnego i poruszającego, poza kolejną ułomnością php ?
koala
~mike_mech obiecuję już nigdy więcej smile.gif
Wydaje mi się że nie dla wszystkich jest to takie oczywiste. Jak przeczytają ten topic i zaglądną do takiej klasy jak np. final class Zend to będą wiedzieli dlaczego ona jest taka a nie inna. Przecież można by ją zrobić nie jako singleton i też by wszystko działało ale po co wolniej jak można szybciej.
dr_bonzo
~koala: wez poczytaj o czym piszesz, bo tym razem mieszasz klasy finalne (final class) z singletonami. Nierozszerzalna klasa to nie klasa, ktora pozwala na tylko jedna swoja instancje.

Kod ma byc po pierwsze czytelny i zrozumialy dla czlowieka (dzieki czemu bedziesz mogl go optymalizowac, ale nie hakami jak ten, tylko zmiana algorytmu, cachowaniem wynikow, itp.) a nie tylko maksymalnie wydajny.
Jarod
Z testów wynika, że funkcje statyczne są wolniejsze od metod.. Czas waha się od 2 do kilkunastu sekund przy zwiększonym przebiegu pętli i odpaleniu skryptu na 3 przeglądarkach..
oopphp5
To dość stary temat pomyślałem jednak że coś napiszę od siebie.
Drodzy panowie myślę że można to interpretować jako pewną funkcjonalności PHP.

Może właśnie dlatego nazwy:

Dynamic Static Method - te które dynamicznie stają się statyczne poprzez wywołanie ich w sposób statyczny

Declared Static Method - te które które deklarujemy jako statyczne i jako takie wywołujemy

Oczywiście z naciskiem na używanie tych drugich z racji czytelności i czasów.
W razie czego mamy jednak taką możliwość w ostatecznej ostateczności smile.gif

Co do postawionego pytania to fakt mogłoby zostać postawione w bardziej
doprecyzowany sposób. Nie wchodzie jednak zaraz komuś na głowę.

Może warto by było po prostu dopytać.

Co do tych wywołań to działa to w obie strony smile.gif

  1. class my_class
  2. {
  3. public static function test()
  4. {
  5. echo 'wartosc';
  6. }
  7.  
  8. }
  9.  
  10. $a = new my_class();
  11. $a->test();


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.