Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ABSTRACT][INTERFACE][STATIC][SINGLETON] Klasa abstrakcyjna, interfejs metody statyczne
vokiel
post
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:
  1. <?php
  2. dbLog::write()->error();
  3. dbLog::write()->warning();
  4. ?>

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


  1. interface logInterface {
  2. public static function write();
  3. public function error();
  4. public function warning();
  5. public function notice();
  6. }
  7. abstract class log implements logInterface{
  8. protected static $_instance = null;
  9. protected function __construct(){}
  10. protected function __clone(){}
  11.  
  12. abstract public static function write();
  13.  
  14. abstract public function error();
  15. abstract public function warning();
  16. abstract public function notice();
  17. }
  18. class fileLog extends log implements logInterface {
  19. public static function write(){
  20. return is_null(parent::$_instance) ? parent::$_instance = new fileLog() : parent::$_instance;
  21. }
  22. public function error(){echo 'fileLog - error';}
  23. public function warning(){echo 'fileLog - warning';}
  24. public function notice(){echo 'fileLog - notice';}
  25. }
  26. class dbLog extends log implements logInterface {
  27. public static function write(){
  28. return is_null(parent::$_instance) ? parent::$_instance = new dbLog() : parent::$_instance;
  29. }
  30. public final function error(){echo 'dbLog - error';}
  31. public final function warning(){echo 'dbLog - warning';}
  32. public final function notice(){echo 'dbLog - notice';}
  33. }


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
  1. <?php
  2. dbLog::error();
  3. fileLog::notice();
  4. ?>


Macie jakieś pomysły jak to rozwiązać?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
vokiel
post
Post #2





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ć
  1. log::error('widaomo, że błąd');
  2. // niż
  3. log->log("to jest błąd",log::ERROR);

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)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 15:17