Autor wpisu: Vokiel, dodany: 03.10.2009 11:43, tagi: css, jquery, javascript
Przepraszamy, ten wpis dostępny jest wyłącznie w językach: English.
Autor wpisu: batman, dodany: 01.10.2009 18:09, tagi: javascript
Autor wpisu: thejw23, dodany: 30.09.2009 19:02, tagi: framework, php
Autor wpisu: batman, dodany: 29.09.2009 19:20, tagi: zend_framework
Autor wpisu: batman, dodany: 29.09.2009 19:15, tagi: zend_framework
Autor wpisu: Vokiel, dodany: 28.09.2009 10:56, tagi: php
Ostatnia część tworzenia projektu loggera zdarzeń – klasy Log. Skupimy się na wykończeniu projektu, który naprawi powstałe wcześniej niedociągnięcia, trudności w korzystaniu. Utworzona klasa połączy nam wszystkie funkcjonalności w jedno. Doda kilka funkcjonalności, wprowadzi wygodę w użytkowaniu, łatwość zmian. W pierwszej części ustaliliśmy wymagania klasy Log, ustaliliśmy strukturę, zasady funkcjonowania klasy oraz napisaliśmy interfejs. W drugiej części rozwinęliśmy nasz projekt o klasę logFile implementującą wcześniej utworzony interfejs, omówiliśmy możliwość rozszerzeń funkcjonalności o nowe klasy (LogDB) oraz spotkaliśmy się z problemem szybkiej zmiany rodzaju wykorzystywanej klasy.
Tworzenie klasy
Stwórzmy klasę, która połączy w sobie możliwość używania różnych klas loggera (logFile, logDb). Aby zachować ustalone na początku wymagania, dać możliwość łatwego wykorzystania, szybkiej zmiany silnika bez potrzeby wielu zmian w kodzie oraz maksymalnie skrócić zapis, musimy skorzystać z kilku technologi OOP.
Pierwsza z nich – klasa statyczna, druga – singleton. Czemu tak? Klasa statyczna + singleton załatwi nam szybkie i wygodnie użycie:
log::info('Szybko i sprawnie');
. Dzięki temu, po ustaleniu na początku skryptu silnika przechowywania logów w dalszej części możemy wygodnie korzystać z w/w zapisu. Dodatkowo przejście z logowania do pliku na logowanie do bazy nastąpi tylko w jednym miejscu. Jak zapewne zauważyliście nawet nazwa klasy została maksymalnie skrócona log
, aby użycie było jak najbardziej wygodne.
Zatem do dzieła. Wzór klasy będzie następujący:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class log implements log_log{ private static $driver; private static $drivers = array(); private static $defaultDriverName = 'log_logFile'; protected function __construct(){} protected function __clone(){} public static function instance(){} public static function addDriver(log_log $driver){} public static function useDriver($drivername=''){} public static function error($err,$driverName=''){} public static function warn($err,$driverName=''){} public static function info($err,$driverName=''){} } ?> |
Zmienne klasy
W klasie log mamy zadeklarowane 3 zmienne. Każda z nich ma swoje, łatwe do odgadnięcia, zastosowanie:
private static $driver;
– aktualny sterownik klasy loggera
private static $drivers = array();
– tablica dostępnych (dodanych) sterowników
private static $defaultDriverName = 'log_logFile';
– nazwa domyślnego sterownika
Statyczna zmienna klasy $driver;
przechowuje aktualnie wybrany sterownik, do którego następuje zapis logów. W trakcie korzystania z klasy będzie możliwa zmiana sterownika, dzięki temu, nawet w jednym skrypcie zachowamy możliwość wybrania innego sterownika do zapisu logu konkretnego zdarzenia.
Kolejna zmienna $drivers;
jest tablicą przechowującą obiekty klas poszczególnych sterowników. Dzięki temu po jednokrotnym wykorzystaniu konkretnego sterownika, w przypadku jego ponownego użycia obiekt nie jest tworzony na nowo.
Trzecia zmienna $defaultDriverName;
jak sama nazwa wskazuje, przechowuje nazwę domyślnego sterownika klasy loggera. Dzięki temu klasa jest gotowa do użycia bez ustawiania sterownika przy każdym, pierwszym, uruchomieniu skryptu.
Metody
Trzech ostatnich metod error(), warn(), info()
nie muszę omawiać, zostało to już przedstawione w poprzednich częściach. Jedyną różnicą względem poprzednich implementacji jest dodanie nowego parametru: $driverName =''
. Parametr ten, jak nazwa wskazuje, podaje nazwę sterownika, którego należy użyć do zapisu danego komunikatu. Domyślnie nie jest zdefiniowany, a w przypadku jego nie podania, wykorzystywany jest domyślny sterownik. Istnieje jednak możliwość podania innego sterownika do zapisu konkretnego komunikatu. Dzięki temu rozszerzamy funkcjonalność naszej klasy, o wybór sterownika dla konkretnego komunikatu, lub pojedynczego wystąpienia.
Utworzyliśmy dwie metody z dostępem ustawionym na protected:
protected function __construct(){} protected function __clone(){}
Ich zadaniem jest pilnowanie, aby nasza klasa była rzeczywiście singletonem. Zabezpiecza przed utworzeniem nowego obiektu klasy log z poza niej samej oraz przed utworzeniem kopii takiego obiektu.