Property

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

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 K.
 */
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