Как создать объект в родительском классе, разделяемом его дочерними классами?

У меня есть 4 класса, один помощник базы данных и 3:

abstract class PageElement { protected $db; abstract public function reconstruct($from, $params = array()); protected function construct_from_db($id, $k) { $this->db = new Database(0); $query = "SELECT * FROM $k WHERE id = %d"; $results = $this->db->db_query(DB_ARRAY, $query, $id); return $results[0]; } } class Section extends PageElement { function __construct($construct, $args = array()) { $params = $this->construct_from_db($args, 'sections'); } //other methods } class Toolbar extends PageElement { function __construct($construct, $args = array()) { $params = $this->construct_from_db($args, 'toolbars'); } //other methods } 

Сейчас у каждого ребенка есть собственный экземпляр объекта Database. Как создать объект базы данных в родительском классе и поделиться им с каждым ребенком?

ЗАМЕТКА:

  • Я читал о методе Singleton, но я не могу его использовать, так как мне нужно подключиться к различным базам данных.
  • Можно отметить, что класс класса создает экземпляр класса панели инструментов.
  • Другая проблема заключается в том, что по какой-то причине я не могу закрыть соединение mysql. Это предупреждение появляется, когда я запускаю код:

    mysql_close (): 7 не является допустимым ресурсом MySQL-Link в ** * * \ classes \ database.class в строке 127.

Solutions Collecting From Web of "Как создать объект в родительском классе, разделяемом его дочерними классами?"

В идеале вы должны создать объект базы данных вне этих классов, а затем ввести его через функцию конструктора или сеттера.

 abstract class PageElement { protected $db; function __construct($db) { $this->db = $db; } //...rest of the methods } class Toolbar extends PageElement { function __construct($construct, $db, $args = array()) { parent::__construct($db); $params = $this->construct_from_db($args, 'toolbars'); } //other methods } 

Затем вы можете создавать свои объекты:

 $db = new Database(0); $toolbar = new Toolbar($construct,$db,$args); $section = new Section($construct,$db,$args); 

Таким образом, все объекты будут совместно использовать один и тот же объект базы данных.

PS: Вместо создания объекта базы данных, используя здесь новый, вы можете получить его с параметризованной фабрики.

 $db = Factory::getDBO($param); 

Предположим, вы могли бы ставить $db static.