如何在子类共享的父类中创建对象?

时间:2011-10-25 12:34:11

标签: php class object

我有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的方法,但我不能使用它,因为我 必须连接到不同的数据库。
  • 可能值得注意的是,Section类创建了一个Toolbar类的实例。
  • 另一个问题是,由于某种原因,我无法关闭mysql连接。运行代码时会出现此警告:

    mysql_close():7在第127行的** * * \ classes \ database.class中不是有效的MySQL-Link资源。

2 个答案:

答案 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静态。