2010-04-14 41 views
3

我發現自己在我的代碼爲「高速緩存」所做的工作實例我Zend_Db_Table模型時,這樣做:Zend框架 - 數據庫表辛格爾頓

if (Zend_Registry::isRegistered('x_table')) { 
    $x_table = Zend_Registry::get('x_table'); 
} else { 
    $x_table = new Default_Model_DbTable_X; 
    Zend_Registry::set('x_table', $x_table); 
} 

令我很煩惱,這種方法不是很乾,今天我明白了單身模式可能是更好的方式來做到這一點。問題是,我從來沒有寫過一個單獨的課程。當我做了一些網絡搜索時,我發現了一些關於Zend_Db_Table單身的非正式評論,但沒有真實的例子。

我已經配置了元數據緩存。

  1. 如何使我的Zend_Db_Table模型單身?
  2. 有缺陷或缺點嗎?

編輯:我的思考能力單身的原因是,答案是,我認爲我可以簡單地具有下列電話在我的代碼$x_table = new Default_Model_DbTable_X;,如果它存在的單個實例將被返回。如果這是可能的,我寧願這個解決方案。

+1

你在你的代碼中做了什麼,你需要在相同的請求中實例化同一個表的多個實例? – Gordon 2010-04-14 22:14:20

+2

*(參考)* http://sourcemaking.com/design_patterns/singleton – Gordon 2010-04-14 22:17:59

+0

我正在構建一個CMS並且這些表格包含內容。內容塊可以放在一個頁面中,並且頁面中可能有多個相同類型的塊。感謝您的參考! – Sonny 2010-04-14 22:56:02

回答

3

爲什麼不在一些合理的地方管理DbTables?如果沒有明智之處,請創建一個DbTableManager類。類似於:

<?PHP 
class DbTableMgr { 

    protected $_tables; 

    public function getTable($classname){ 
    if (empty($this->_tables[$name])){ 
     //assuming some things about class names for the sake of brevity elsewhere... 
     $classname = 'Default_Model_DbTable_',ucfirst(strtolower($classname)); 

     $this->_tables[$name] = new $classname; 
    } 
    return $this->_tables[$name]; 
    } 
} 

在引導程序中初始化管理器並將其保存在註冊表中。

然後:

<?PHP 
//in a galaxy far, far, away 
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo'); 

所以,你懶加載DBTABLE對象,並執行一個單身的行爲。

如果你願意,你可以用各種方法制作上面的靜態文件。

+0

你的'Zend_Registry'方法看起來不錯,但我對你的「理智的地方」的含義很感興趣。這聽起來像是暗示'Zend_Registry'是第二好的解決方案。 – Sonny 2010-04-14 23:01:15

+0

Zend_Registry很適合這種事情。我的意思是,根據應用程序的設計,可能會有一個更明智的地方來實現dbTableManager的東西。但是,如果你不確定,那麼就像我展示的那樣創建一個類,並在引導數據庫內容時將其粘貼到註冊表中並沒有什麼錯。 – timdev 2010-04-14 23:05:03

+0

好吧,這是一個古老的問題,但好奇。爲什麼不把它作爲一個標誌。如果沒有其他增加便利性。UserTable :: getInstance() - > getUsers() – 2013-06-11 04:41:55