Вот набросал вариант глобального реестра. Это стандартная реализация паттерна Registry в виде единственного экземпляра, но еще и с некоторыми фишками. Одна из них, если это можно назвать фишкой, - возможность обращения к защищенным свойствам из статических методов. Не знаю на сколько это круто, но меня почему-то пропёрло.
Думаю, неплохо получилось, так что комментировать мне уже нечего. Но вы можете это сделать в комментариях.
Listing №1 (PHP)
<?php
//интерфейс базы данных
interface Db {
function foo();
}
//база данных
class RealDb implements Db {
function foo()
{
echo 'real db';
}
}
//фиктивная служба базы данных
class TestDb implements Db {
function foo()
{
echo 'test db';
}
}
//Реестр
class Registry {
private static $_instance = null;
protected $_db;
public static function init($instance)
{
self::$_instance = new $instance();
if (!self::$_instance instanceof Registry) {
throw new Exception('');
}
}
private static function getInstance()
{
if (!self::$_instance) {
self::init('Registry');
}
return self::$_instance;
}
public static function getDb()
{
return self::getInstance()->_db;
}
protected function __construct() {
$this->_db = new RealDb();
}
private function __clone() {}
}
//Реестр для тестирования
class TestRegistry extends Registry {
protected function __construct() {
$this->_db = new TestDb();
}
}
////Пример
//Инициализация для тестирования
//Registry::init('TestRegistry');
$db = Registry::getDb();
$db->foo();
Раскомментируйте 72 строчку для инициализации другого варианта реестра. Можно заметить, что это похоже на глобальную фабрику.
Спасибо за класс! Попробую использовать.
Листинги из блога копировать неудобно, куча лишнего копируется.
А капча жжет, я сначала думал предыдущий символ на клавиатуре, но наверное в алфавите, сейчас проверю...