V mojom prvom riadnom príspevku do nového blogu prejdem rovno k veci, ktorej sa práve venujem. Začnem technickým článkom pre programátorov v PHP. Opíšem návrh, ktorý som použil v mojej práve programovanej práci.

PHP od verzie 5.3 obsahuje zaujímavú funkciu, get_called_class(). Táto nenápadná funkcia nám tak otvára nové možnosti návrhu tried. Vracia totiž triedu neskorej statickej väzby.

Odbočka: Čo je to neskorá statická väzba?

Neskorá statická väzba umožňuje získať názov volanej triedy zo statickej funkcie triedy, z ktorej sa dedí.

Príklad prevzatý zo stránok manuálu PHP:

<?php
class foo {
	static public function test() {
		echo get_called_class();
	}
}
class bar extends foo {}

foo::test(); // Vypise foo
bar::test(); // Vypise bar
?>

Singleton pattern

Singleton pattern je návrhový vzor, keď z danej triedy chceme mať len 1 instanciu, ktorú chceme, aby sa vytvorila pri prvom volaní a neskôr sa uchovávala v pamäti.

A teraz si ukážeme, ako si pomocou tejto technológie vyrobiť Singleton pattern, ktorý by sme inak museli písať do každej triedy zvlášť.

<?php
abstract class Singleton
{
	private static $instances = array();
	protected function __construct() {}
	protected function __clone() {}

	final public static function getInstance()
	{
		$calledClass = get_called_class();
		if(!isset(self::$instances[$calledClass]))
			self::$instances[$calledClass] = new $calledClass();
		return self::$instances[$calledClass];
	}
}
?>

Premenná $instances uchováva instancie objektov podľa mena. V ďalších riadkoch zakážeme verejnú konštrukciu alebo klonovanie objektu. Metóda getInstance() už potom robí to, čo má robiť pri klasickom Singleton.

Príklad použitia

<?php
class DB extends Singleton
{
	//... telo triedy ...
	protected __construct()
	{
		//... skonstruujeme objekt ako by sme to bezne robili ...
	}
}

// V dalsom kode volame jednoducho
$db = DB::getInstance();
?>

Pre článok som povolil komentáre. Píšte svoje názory.