Property
Z PHPEdia.pl
Wzorzec Property
Zmienne globalne to samo zło. Wprowadzają bałagan w kodzie i powodują czasem dziwne błędy. Kod, w którym użyto zmiennych globalnych często jest nieodczytywalny dla zwykłego programisty przeglądającego kod. "Skąd ta zmienna się tam wzięła?" - odpowiedzi na to pytanie trzeba szukać po wszystkich plikach całej aplikacji.
Najlepszym rozwiązaniem zdawał się być Singleton. Wzorzec ten wymaga jednak dość poważnej ingerencji w kodzie (często przebudowy całej klasy).
Dzisiaj Em1x zwrócił moją uwagę na całkiem niepopularny, ale genialny (tak jak większość wzorców ;]) wzorzec Property. Jego działanie jest bardzo proste. Posiada on statyczną tablicę, w której zapisujemy zmienne. Do zapisywania i odczytywania służą dwie metody statyczne: set ($name, $value) i get ($name). Genialne, prawda?
Takie rozwiązanie jest nie tylko proste, szybkie i użyteczne. Ono jest też poprawne, czytelne i rozwiązuje wszystkie problemy ze zmiennymi globalnymi. Nasze zmienne dostępne są od teraz w całym skrypcie i nie wchodzą w paradę zmiennym lokalnym. A implementacja zajmuje jedynie kilka linijek :)
Czas na kod. Poniżej dwa listingi - pierwszy ukazuje klasą Property, a więc implementację wzorca, drugi - przykład użycia. Kod działa tylko pod PHP5. Miłego używania.
<?php /** * Implementacja wzorca Property * @author Filip Konarowski */ class Property { /** * Przechowuje wszystkie zmienne * @var array */ private static $keys; /** * Prywatny konstruktor uniemożliwia utworzenie instancji klasy */ private function __construct () {} /** * Zwraca dana zmienna * @param string nazwa zmiennej * @return string zawartosc zmiennej */ public static function get ($key) { if (isset (self::$keys[$key])) { return self::$keys[$key]; } else { return null; } } /** * Tworzy nowa zmienna badz zmienia wartosc juz utworzonej zmiennej * @param string nazwa zmiennej * @param mixed wartosc zmiennej */ public static function set ($key, $value) { self::$keys[$key] = $value; } } ?>
<?php require ('Property.php'); Property::set ('zmienna1', 'wartość'); Property::set ('zmienna2', 'inna wartość'); function setProperty () { Property::set ('napisane', 'tak'); } setProperty (); print (Property::get ('zmienna1')); // wartość print (Property::get ('zmienna2')); // inna wartość print (Property::get ('napisane')); // tak ?>
Strona ta opisuje jeden z Wzorców projektowych.
Wzorce projektowe: Definicja | Zalety | Podział wzorców | Lista wzorców
