Автозагрузка класса базы данных - PullRequest
1 голос
/ 13 сентября 2009
  • Можно ли избежать создания экземпляра объекта Db внутри объекта Names для доступа к нему в любом случае?
  • Будет ли __autoload работать для этого?
  • Есть ли другое умное решение?

У меня есть следующие классы (они являются концептуальными, поэтому они не будут работать при выполнении):

Db {
    function connect($config) {
        // connect to data base
    }
    function query($query) {
        // Process a query
    }
}
Names {
    function show_names($query) {
        $Db = new Db(); // Is it possible to autoload this object?
        $Db->query(query);
        // Print data
    }
}

Ответы [ 2 ]

2 голосов
/ 13 сентября 2009

Классы могут быть автоматически загружены, но объекты должны быть созданы. Кажется, ваша проблема состоит в том, чтобы сделать эти два класса более свободными. Вероятно, самое простое решение этой проблемы - использование шаблона проектирования Singleton . Однако это не лучшее решение, так как вы можете решить использовать более 1 подключения к базе данных, и это также становится проблематичным при модульном тестировании. Я предлагаю взглянуть на концепцию Dependency Injection , которая является более сложной, но гораздо более гибкой.

2 голосов
/ 13 сентября 2009

Решение, которое часто используется для классов, связанных с подключением к базе данных, заключается в работе с Singleton Design Pattern ( пример реализации в PHP ).

Это позволяет иметь класс, который будет инкапсулировать соединение с БД, и будет гарантировать, что только одно соединение будет открыто в течение всего времени жизни сценария PHP - никогда больше.

Это позволит вам использовать такой синтаксис, как этот:

$db = Db::getInstance();
$db->query('...');

Или:

Db::getInstance()->query('...');


Об автозагрузке: она будет работать, пока: есть способ сопоставить имя класса с файлом.

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