#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. Не означает ли это, что каждый новый экземпляр каждого объекта будет ссылаться на один и тот же объект базы данных?