![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, przeczytałem zawartość działu OOP na temat klasa abstrakcyjna + interfejs. Jednak w większości nie był poruszany temat metod statycznych, a tym bardziej singletona.
Zaplanowałem sobie taki mały systemik logowań zdarzeń. Chciałem oprzeć go o klase abstrakcyjną + interfejs, a przy okazji chciałem użyć do tego celu singletona, aby późniejsze wywołanie mogło sprowadzić się do:
Oto co próbowałem zrobić, jednak to nie działa, dostaję błąd: Kod Fatal error: Can't inherit abstract function logInterface::write() (previously declared abstract in log) in C:\xampp\htdocs\test.php on line 10
Myślałem o przeniesieniu metody write() do klasy abstrakcyjnej log, zrobienie z niej static (czyt final static) Ewentualnie mógłbym zrobić w każdej metodzie error, warning, notice odwoływanie się do singletona tak, żeby użycie uprościć do
Macie jakieś pomysły jak to rozwiązać? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Po co deklarujesz w Log abstrakcyjne metody, które i tak są wymuszone przez interface?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
A no właśnie, tak to jest jak się za długo siedzi nad jednym kodem i go przerabia co chwila na różne sposoby.
W pierwszej wersji miało być bez interfejsu, ale później wymyśliłem, żeby go jednak dodać. Chciałem przenieść metodę write do klasy abstrakcyjnej. Jednak nie wiem jak ugryźć w niej poprawne tworzenie nowego obiektu dla klas potomnych. Nie wiem czy jest poprawnie (ma sens) taki sposób: (co prawda skraca zapis użycia)
Myślałem na początku, że nie da się utworzyć wspólnej metody dla singletona w klasie abstrakcyjnej. Zmienna $_instance przechowująca obiekt musi być przecież inna dla fileLog, a inna dla dbLog. Zatem zmienne te trzeba tworzyć dla klas dziedziczących oddzielnie, i na nich operować, bo inaczej $_instance przechowywałaby obiekt pierwszej klasy która go wywołała. Nie wiem co ja chciałem zrobić, singletona na klasę abstrakcyjną (IMG:style_emoticons/default/sciana.gif) Ale jak przeniosłem te zmienne do klas dziedziczących, i odwoływałem się do nich w klasie rodzica okazało się, że się da. Tylko czy może lepiej zrobić tak jak poniżej?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Możesz jeszcze powiedzieć czy dbLog i fileLog używane są zamiennie (tj. programista decyduje się na używanie jednego albo drugiego) czy równolegle (tj. używane jest w jednym skrypcie zarówno jedno jak i drugie)? Wydaje mi się, że to pierwsze, ale jakbyś mógł wyjaśnić wszystko.
Swoją drogą... na Twoim miejscu zastanowiłbym się czy nie lepsze byłoby dobieranie się do obiektu Log przy pomocy np. kontekstu niż robić z niego singletona. Nie ma też sensu robić trzech osobnych metod do zapisywania. Wystarczy jedna, z dodatkowym parameterm określającym "poziom": Co do szkieletu klas...
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
@Crozin dzięki wielkie za zainteresowanie.
Chcę zrobić dość uniwersalny system logów, będzie wykorzystywany moduł plikowy, jak id db, dlatego chciałem mieć to razem, z możliwością łatwego przełączania. Na razie bardziej zamiennie, ale z czasem może mi się coś odmienić. Poza tym zawsze przyda się mała wprawka bardziej obiektowego php (IMG:style_emoticons/default/winksmiley.jpg) Zrobiłem 3 metody zapisywania, aby później skrócić użycie. Co prawda zastanawiałem się też nad jedną metodą z flagami - w poprzedniej klasie logów tak miałem, jednak czasem zdarzało mi się niechcący wybrać nie tą flagę (wtedy jeszcze miałem 2 binarnie: 0 i 1). Później w podglądzie logów miałem nieodpowiednie kolorowanie. Teraz chcę po prostu sprawdzić inny sposób, zobaczyć jak to się będzie sprawdzało. Ta wersja wydaje się być wygodniejsza, szybciej i jaśniej jest napisać
Rozbudowy, czy dodatkowego rozszerzania tych klas, za bardzo nie widzę. Nawet jeśli, to zawsze można zedytować jedną klasę abstrakcyją i powinno bez problemu działać. Zdaję sobie sprawę, że jest to trochę przerost formy nad treścią, ale nie raz się robi coś nieekonomicznego dla wygody:) Przewiduję, że te 3 metody będą odwoływały się do wspólnej jednej prywatnej, z tą tylko różnicą, że będą ustawiać inną flagę. Czyli zamiast trzech flag i jednej metody, są trzy metody (może 4) i nie ma flag (IMG:style_emoticons/default/biggrin.gif) Mam nadzieję, że będzie się później tego wygodniej używało (IMG:style_emoticons/default/winksmiley.jpg) A jeśli nie, to skorzystam z Twojego schematu (IMG:style_emoticons/default/smile.gif) Pozdrawiam, i dziękuję za pomoc (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.09.2025 - 14:21 |