2009-08-22 19 views
34

Robiąc ostatnio recenzje kodu natknąłem się na kilka klas, które mają w sobie znaczną liczbę metod statycznych ... i nie mogę zrozumieć, dlaczego? Stąd moje pytanie:Kiedy używać modyfikatora statycznego w PHP

Jakie są najlepsze praktyki dotyczące korzystania z metod statycznych w PHP?

Kiedy należy z nich korzystać i kiedy nie należy ich używać?

Jaka jest szczególna różnica w sposobie, w jaki środowisko wykonawcze obsługuje metody statyczne? Czy wpływają na wydajność lub ślad pamięci?

+1

Nikt nie odpowiedział na ostatnie pytanie do tej pory - "Czy mają one wpływ na wydajność lub ślad pamięci?" Statyczne są ogólnie zniechęcane w Javie. Nie jest to również prawdą w przypadku języka interpretacji, takiego jak PHP. – powerboy

+0

jeśli robisz OOP (tak jak oznaczono tagami), to nigdy: http://stackoverflow.com/questions/5167660/static-method-get-is-this-bad-practice/23386464#23386464 –

Odpowiedz

23

Robi niektóre opinie kodu ostatnio natknąłem się na liczbie klas, które mają znaczną liczbę metod statycznych w nich ... i nie mogę zrozumieć, dlaczego wydaje się

PHP nie ma przestrzenie nazw przed 5.3, więc wszystkie funkcje/zmienne miałyby zasięg globalny, chyba że należałyby do jakiejś klasy. Umieszczenie ich w klasie jako statycznych członków jest obejściem dla braku przestrzeni nazw (i prawdopodobnie dlatego widzieliście je w "znaczącym" numerze)

Zasadniczo są one używane do funkcji, które nie są zbyt przydatne w poszczególnych obiektach, ale ma pewne zastosowanie na poziomie klasy (jak wspomniano w innych odpowiedziach)

+2

Porządkowanie funkcji powiązanych jako Statyka w klasach odkrywa również potężną funkcję PHP: Możliwość autoloadowania klas na żądanie. Jeśli pozwala ci pisać swój kod bez martwienia się o odpowiednie załączniki i bez potrzeby dodawania czegoś, czego nie zawsze możesz użyć. Po prostu wywołujesz swoją statyczną metodę, a '__autoload()' robi magię. Czyste, zoptymalizowane i funkcjonalne kodowanie. Nawet obszary nazw nie mają jeszcze tej. – Havenard

1

Nie trzeba tworzyć instancji klasy, aby używać jej metod statycznych.

5

metody statyczne są używane do

  • funkcji, które są związane z całego zbioru obiektów danej klasy (np singleton pattern)
  • funkcje, które nie są podobne do niczego, ale muszą być umieszczone w punkcie a klasa z powodu OO (np. klasy narzędziowe)
4

Metoda statyczna nie wymaga instancji (i może zwrócić ją zamiast niej) i jest bardziej lub mniej podobna do funkcji globalnej, z tym wyjątkiem, że jest umieszczana w przestrzeni nazw klasy (i dlatego unikaj kolizji jony z innymi funkcjami) i ma dostęp do prywatnych członków klasy.

Używaj go zawsze, gdy interesują Cię te właściwości funkcji.

3

Nie ma nic specyficznego dla PHP w stosowaniu metod statycznych.

Metody statyczne można wywoływać bezpośrednio na klasie - nie ma potrzeby tworzenia instancji obiektu.

Ich główne zastosowanie dotyczy metod powiązanych z funkcjonalnościami klas, ale nie jest potrzebna istniejąca instancja do użycia dla innego kodu.

Typowym przykładem jest niestandardowa metoda porównania, którą można przekazać np. Do funkcji uasort() w celu posortowania tablicy obiektów typu "class".

5

Najlepszą praktyką jest unikanie ich stosowania, gdy tylko jest to możliwe, ponieważ zabijają testowalność i łatwość konserwacji.Dwa wielkie czyta że wyszukane:

Wyjaśnienie: Wydaje się, że wiele nieporozumień w tej kwestii. Brak zastrzyku uzależnienia jest prawdziwym problemem. Bezpośrednie wywoływanie metod statycznych jest jednym z najczęstszych sposobów wpadnięcia w tę pułapkę.

+3

Widziałem już te argumenty, ale nie są one przekonujące. Sposób, w jaki można testować metody statyczne, nie ma skutków ubocznych; takie metody są najbardziej testowalne ze wszystkich; dajesz im dane wejściowe, zwracają dane wyjściowe, to wszystko. Trudna zależność od argumentu klasowego również nie ma znaczenia; grupowanie powiązanych ze sobą metod statycznych w jedną klasę to cały punkt. –

+1

Nie rozwiązałeś sedna obu tych linków - * zależności *. Możliwość testowania zależy od funkcji zależnych. Aby być uczciwym, * możliwe * jest to zrobić przy użyciu funkcji statycznych (np. Poprzez przyjmowanie zależności funkcji jako parametrów). Jednak rozwiązaniem idiomatycznym w PHP jest użycie funkcji niestatycznej, która może zostać przesłonięta przez podklasę. Zobacz http://kunststube.net/static/, aby uzyskać więcej informacji. –

+1

Poprawnie napisane funkcje statyczne * nie mają żadnych zależności *, z wyjątkiem tego, które jest przekazywane bezpośrednio do funkcji. Przetestuj funkcję, upewnij się, że ma oczekiwane zachowanie, a następnie użyj jej we wszystkich innych testach, tak jak jest. Przykłady podane w twoim linku są błędem użycia, ponieważ wywoływanie funkcji więcej niż jeden raz może za każdym razem przynieść różne wyniki. Nie wiem; Po prostu nie widzę korzyści z używania w ten sposób metod "statycznych". –

2

można użyć metod statycznych dla lepszej wydajności. Nie musisz tworzyć obiektu dla każdego użytkownika, który za pomocą aplikacji internetowej i tworzenia obiektu z wieloma metodami i właściwościami jest wolniejszy i potrzebuje znacznie więcej zasobów systemowych.

+0

Czy możesz dodać referencje, które oferują lepszą wydajność? – Justin

Powiązane problemy