Как создать объект в родительском классе, совместно используемом его дочерними классами? - PullRequest
0 голосов
/ 25 октября 2011

У меня есть 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 не является допустимым ресурсом MySQL-Link в **** \ classes \ database.class в строке 127.

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

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

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);
0 голосов
/ 25 октября 2011

Вы могли бы сделать $db статичным, я полагаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...