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

#php #class #object

#php #класс #объект

Вопрос:

У меня есть 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
}
  

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

ПРИМЕЧАНИЕ:

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

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

Комментарии:

1. Хех, «Простак». На самом деле это «одноэлементный» 😉

Ответ №1:

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

 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: Вместо того, чтобы создавать объект базы данных с помощью new here , вы можете получить его из параметризованной фабрики.

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

Комментарии:

1. Зависит от того, как вы это реализуете. Ваша фабрика может возвращать либо новый экземпляр, либо тот же экземпляр (т.Е. одноэлементный)

Ответ №2:

Я полагаю, вы могли бы сделать $db статический.

Комментарии:

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