让我们想象一下我们有注册表模式......
<?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()
or Redis()
仅在我们请求时才会创建。一切似乎都很好,但正如你所看到的,它不是一个独立的类,因为_db()
, _redis()
方法包含连接常量等。
如何避免呢?如何在注册表类中定义注册表方法来分离 Registy 类和其中的对象?
我真的很抱歉我的英语不好,但我希望你能明白。
谢谢。
PS:上面的所有代码都是 1 分钟编写的。之前并没有经过测试。