![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 155 Pomógł: 0 Dołączył: 15.07.2004 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Mam nadzieję, że temat który poruszę pasuje do tego miejsca. Pierwsze opiszę dziedzinę zagadnienia: Posiadam klasę, która zajmuje się przechowywaniem dowolnych danych (jej dokładna implementacja nie jest dziedziną problemu), ma dość dużą funkcjonalność (iterowanie, zachowywanie zbieżności z danymi zapisywanymi na stałe itp.). Dla naszych rozważań będę nazywał ją test. Klasa test ma 2 interesujące nas metody: get($sName) i set($sName, $mVal) służą one oczywiście do pobierania i zapisywania umieszczonych wewnątrz danych. Szkic implementacji:
Jak wszyscy wiemy same dane to dopiero 30% sukcesu, trzeba na nich jakoś operować. Dlatego najczęściej piszemy klasę, która zawiera dane i metody operujące na nich. Szkoda jednak aby tak duża funkcjonalność klasy się zmarnowała, może ona przechowywać dla nas dowolne dane, zapisywać je w odpowiednie miejsce bez naszego kiwnięcia palcem! Daltego najlepiej byłoby w jakiś sposób rozszerzyć jej funkcjonalność. Nazwijmy nową klasę (operującą na danych z klasy test) test2:
Operowanie w taki sposób na danych w klasie jest niewygodne, dlatego kolejnym krokiem mogłoby być dziedziczenie (musimy także pamiętać aby dane miały zasięg niepubliczny dlatego w klasie test akcesor public zamieniamy na protected):
Jednak w dalszym ciągu projektowanie takiego rozwinięcia do klasy test jest utrudnione. Najlepszym efektem byłoby bezpośrednie używanie zmiennych: Kod $this->a Wydaje się teraz oczywiste użycie magicznych funkcji __get i __set:Niby wszystko działa... Jednak stała się katastrofa, metody __set i __get zawsze są publiczne. Dlatego możemy zrobić tak: Co może prowadzić do katastrofy. Problem ten teoretycznie można rozwiązań używając funkcji debug_backtrace(). Oto teoretyczne rozwiązanie: http://phpfi.com/169155 . Takie rozwiązanie ma pewne plusy: możemy ustalać zasięg zmiennych, jednak z moich pomiarów wynika, że każde takie odwołanie jest o około 0.000025 sec wolniejsze niż bez sprawdzania miejsca uruchomienia. Teraz podstawowe pytania: Czy taki czas jest dopuszczalny dla takiego ułatwienia? Może ktoś widzi inny sposób rozwiązania takiego przypadku? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 27.09.2025 - 15:25 |