Шаблон реестра и ленивый экземпляр зарегистрированных объектов
Давайте представим, что у нас есть шаблон реестра ...
<?php
class Registry
{
private static $objects = array();
private static $instance = null;
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Registry();
}
return self::$instance;
}
protected function _get($key) {
return ($this->objects[$key]) ? $this->objects[$key] : null;
}
protected function _set($key, $val) {
$this->objects[$key] = $val;
}
public static function get($key) {
return self::getInstance()->_get($key);
}
public static function set($key, $object) {
return self::getInstance()->_set($key, $object);
}
}
?>
Используя эту реализацию очень легко ...
<?
Registry::set('db', $db_client);
Registry::set('redis', $redis_client);
//Using registered objects is really easy
Registry::get('db')->query("...");
Registry::get('redis')->get("...");
?>
Но, как вы видите, мы добавляем экземпляры в реестр, даже если они нам не нужны (да, все зависит от производительности). Итак, вопрос в том ... Как изменить шаблон реестра, чтобы можно было выполнять ленивую реализацию?
Вот что я ищу ...
<?
class Registry
{
private static $objects = array();
private static $instance = null;
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Registry();
}
return self::$instance;
}
protected function _db() {
if (!$this->objects['db']) {
$this->objects['db'] = new DatabaseAdapter(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);
}
return $this->objects['db'];
}
protected function _redis() {
if (!$this->objects['redis']) {
$this->objects['redis'] = new Redis(REDIS_HOST, REDIS_DB, REDIS_USER, REDIS_PASSWORD);
}
return $this->objects['redis'];
}
public static function db() {
return self::getInstance()->_db();
}
public static function redis() {
return self::getInstance()->_redis();
}
}
?>
Как вы видете,DatabaseAdapter()
или жеRedis()
будет создан только в том случае, если мы их запросим. Кажется, все в порядке, но, как вы видите, это не отдельный класс, потому что_db()
, _redis()
методы содержат константы соединения и т.д. Как этого избежать? Как определить метод реестра в классе реестра, чтобы разделить класс Registy и объекты внутри него?
Мне очень жаль моего английского, но я надеюсь, что он вам понятен.
Спасибо.
PS: Весь код выше был написан 1 мин. назад и не был проверен.