我有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对象实例。如何在父类中创建数据库对象并将其共享给每个子类?
注:
另一个问题是,由于某种原因,我无法关闭mysql连接。运行代码时会出现此警告:
mysql_close():7在第127行的** * * \ classes \ database.class中不是有效的MySQL-Link资源。
答案 0 :(得分:3)
理想情况下,您应该在这些类之外创建数据库对象,然后通过构造函数或setter函数注入它。
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);
这样所有对象都将共享同一个数据库对象。
P.S。:不是使用new在这里创建数据库对象,而是可以从参数化工厂获取它。
$db = Factory::getDBO($param);
答案 1 :(得分:0)
我想你可以$db
静态。