2012-01-11 1 views
1

Так что в настоящее время мой class DATABASE использует один тоннель для соединения и вызывается в конструкторе моего class SQL. У меня есть 4 других класса, которые расширяют class SQL для доступа к его методам. Проблема в том, что в некоторых случаях дети копируют друг друга, поэтому я боюсь, что создаю несколько объектов 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 будет содержать объект соединения с фактической базой данных и быть создан один раз из-за Singleton в расширенном классе. Правда?? – Naterade

+0

действительно не распространяется, я бы сказал, что все классы смогут использовать один экземпляр базы данных. – Nazariy

+0

Мне нравится ваш подход, спасибо! – Naterade