2012-01-11 5 views
1

現在私のclass DATABASEは接続にシングルトンを使用し、私のclass SQLのコンストラクタで呼び出されます。私はそのメソッドにアクセスするためにclass SQLを拡張する4つのクラスを持っています。問題は、子どもがいくつかのケースでインスタンス化するため、デフォルトで親コンストラクタ(別名class SQL)を呼び出すため、複数のclass SQLオブジェクトが作成されてしまうのではないかと心配です。私は依存性注入について読みましたが、私の状況でそれを実装する方法は明確ではありませんので、これは私が考えていたものです。 すべてのクラスをclass DATABASEに拡張し、class SQLメソッドを静的にします。 しかし、私はclass DATABASEでシングルトン接続をそれ自身のクラスで呼び出す必要があります。PHPは、親クラスが子どもからの複数のインスタンス化を防止しますか?

class DATABASE { 

    function __construct() { 
     self::getInstance(); 
     /// or DATABASE::getInstance (im not quite positive which way) 
    } 

    public static function getInstance() { 
     if (self::$instance == false) { 
     self::$instance = new DATABASEMANAGER(); 
     } 

     return self::$instance; 
    } 
} 

は、私は複数のオブジェクトを作成しておりません知っている、すべてのクラスがclass DATABASEを拡張するので、この方法を理解し、お互いをインスタンス化します。 私はこれが意味をなさないことを願っています。あなたが私を必要とする場合、私はもっと詳しく説明できますが、これは私の問題へのアプローチとして以来のことですか?

答えて

1

あなたのクラスを他の方法で構築すると思いますが、このアプローチは私の意見では一貫しています。

class DATABASE extends DATABASEMANAGER 
{ 
    static $instance; 

    private function __construct() 
    { 
     parent::__construct(); 
    } 

    public static function getInstance() 
    { 
     if (empty(self::$instance)) 
     { 
      self::$instance = new self(); 
     } 

     return self::$instance; 
    } 
} 

使用法:

class Blog 
{ 
    public function __construct() 
    { 
     $this->database = DATABASE::getInstance(); 
    } 

    public function getRecord($id) 
    { 

     $result = $this->database->query("SELECT * FROM blog WHERE id='{$id}'"); 
     //or 
     $result = DATABASE::getInstance()->query("SELECT * FROM blog WHERE id='{$id}'"); 

     //other actions... 
    } 
} 
+0

私は私はあなたがになってものを見ると思います。したがって、すべてのクラスはデータベースを拡張します。 DATABASEMANAGERは実際のデータベースへの接続オブジェクトを含み、拡張クラスのシングルトンのために一度インスタンス化されます。本当? – Naterade

+0

実際には拡張されていない、私はすべてのクラスが単一のデータベースインスタンスを使用できると言うだろう。 – Nazariy

+0

私はあなたのアプローチが好きです、ありがとう! – Naterade

関連する問題