讓我們想象一下,我們有登記的圖案......註冊模式和註冊的對象的延遲實例
<?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分鐘。之前並沒有經過測試。
在5.3,你可以這樣做:返回本 - > _數據[$服務]: - ($服務 '::創建')返回此> _數據[$服務] = call_user_func – 2013-06-14 00:47:44
@ChrisDaMour但爲什麼我會在可讀性較差的時候? – Gordon 2013-06-14 04:53:07
這只是一個意見,我發現它比if塊更清潔 – 2013-06-14 06:39:29