0

Zendモデルをシングルトンにしたいので、これを行いました:

class Social_Model_DbTable_Dossier extends Zend_Db_Table_Abstract {

private static $_instance;

public static function GetInstance() {
    if (!self::$_instance instanceof self) {
        self::$_instance = new self();
    }
    return self::$_instance;
}

private function __construct() {
    // put normal constructor code.
    // it will only ever be called once
}}

次のようにモデルをインスタンス化します。

        $dossiercasModel =  Social_Model_DbTable_Dossier::GetInstance();

しかし、このエラーが発生しました:

Fatal error: Access level to Social_Model_DbTable_Dossier::__construct() must be public (as in class Zend_Db_Table_Abstract)

モデルのコンストラクターをパブリックとして配置すると正常に動作しますが、これはシングルトンの概念と矛盾しています!

4

1 に答える 1

0

過去に、マルチトンのようなキャッシュされたテーブルインスタンスを提供するテーブルブローカーを作成することで、これを行う必要がありました。

簡単な例

class My_TableManager{

   protected static $_instance;
   protected $_tableCache = array();

   protected function __construct(){

   }

   public static function getInstance(){
       if (!isset(self::$_instance)) self::$_instance = new self();
   }

   public function getTable($tableName){
        if (!array_key_exists($tableName, $this->_tableCache)){
            // you can do fun stuff here like name inflection
            // Im assuming that tables will be suffixed with _Table
            $tableClass = "My_".$tableName."_Table";
            $this->_tableCache[$tableName] = new $tableClass();
        }
        return $this->_tableCache[$tableName];
   }

   public static function get($tableName){
        return self::getInstance()->getTable($tableName);
   }
}

My_User_Table のインスタンスを取得するために使用するには、次のようにします。

$table = My_TableManager::get("My_User");

また

$table = My_TableManager::getInstnace()->getTable("My_Table");
于 2013-05-10T21:30:43.470 に答える