W teoretycznej klasie dostępu do baz danych odkryłem, że istnieje sporo funkcji pomocniczych, których używam w klasie, które nie mają nic do czynienia z instancją klasy (i innymi, które można zmanipulować niezwiązane z instancją klasy za pomocą wtrysku zależności).Wady metod statycznych w PHP
Na przykład mam funkcję, która pobiera ciąg między dwoma innymi ciągami w zmiennej. Myślałem o przeniesieniu tego do klasy String_Helper lub czegoś w tym rodzaju. Ta funkcja została już wykonana statycznie.
Mam również funkcję, która wysyła zapytanie do bazy danych: query($sql)
. Szczegóły połączenia są dostarczane przez instancję, ale rozważam nadanie jej charakteru statycznego i użycie query($sql, $connection)
. Programiści mogliby wówczas wywoływać go statycznie i nie musieliby w ogóle tworzyć instancji klasy bazy danych.
Dla mnie pytania to:
Czy warto zrobić coś takiego? Funkcje takie jak funkcja zapytania sprawiają, że zastanawiam się, czy to nie tylko ja staram się, aby wszystko było jak najbardziej statyczne, bez żadnej realnej potrzeby. W jakich okolicznościach uznałbyś to za przydatne?
Wiem, że funkcje statyczne są trudniejsze do przetestowania, ale jeśli upewnię się, że ich kod jest całkowicie niezależny od zależności (lub używa wtrysku zależności w razie potrzeby), to są one równie łatwe do przetestowania, jak wszystko inne, z pewnością?
W tej chwili nie jest to problemem, ale jeśli w przyszłości zdecyduję się rozszerzyć klasy o funkcje statyczne, niemożliwe będzie sprawienie, by obecny kod korzystał z moich rozszerzonych funkcji. Myślałem o Singletonach, ale pojawia się ten sam problem: kod będzie wywoływał
Singleton_Class::getInstance()
, a nieMy_Extended_Singleton_Class::getInstance()
. Dependency Injection wydaje się być jedynym sposobem na rozwiązanie tego problemu, ale może to prowadzić do bardziej spójnego API, ponieważ każda zależność musi być podana do obiektu na__construct()
.Mam klasę kontenera, która przechowuje pewne informacje statycznie, aby można było uzyskać do nich dostęp w dowolnym miejscu skryptu (zasięg globalny). Gdybym nie mógł używać funkcji statycznych lub pojedynczych, klasa zawierająca instancje różnych zmiennych byłaby świetna. Można użyć na przykład
Container::$objects['MyClass'] = $MyClass_object;
, a reszta kodu może po prostu uzyskać dostęp doContainer::$objects['MyClass']
. Jeśli rozszerzyłem klasę MyClass, mógłbym użyćContainer::$objects['MyClass'] = $MyExtendedClass_object;
, a kod, który użyłbyContainer::$objects['MyClass']
używałby MyExtendedClass zamiast MyClass. Jest to zdecydowanie najlepszy sposób na zrobienie tego, moim zdaniem, ale chciałbym wiedzieć, co o tym myślisz.
Z tymi pytaniami próbowałem rozwiązać dwa problemy: Po pierwsze, czy warto byłoby robić rzeczy statyczne i jakie problemy/wady mogą wynikać z tego. Po drugie, chciałem znaleźć najprostszy sposób na przechowywanie paczki instancji obiektów, udostępniając je w razie potrzeby. Twój pomysł użycia rejestru, który zostanie wstrzyknięty do dowolnej funkcji, która może wymagać zależności, jest genialny, ponieważ oznacza to, że interfejs API nie jest zaśmiecony argumentami dla wszystkich zależności i wciąż mam sposób na zarządzanie dowolną liczbą instancji obiekt. Dziękuję Ci. :) –
@Bruno: Nie ma problemu. Jest to dość standardowy sposób interakcji z dużą liczbą obiektów. Ma tę zaletę, że jest bardzo testowalny, ponieważ po prostu tworzysz rejestr pełen fałszywych obiektów (lub tylko ten, którego klasa potrzebuje twoje testy) i wstrzykujesz to. Nie ma żadnych globalnych skutków ubocznych, więc nie musisz się martwić o przypadkowe złamanie czegokolwiek. Powodzenia ... – ircmaxell