Это хорошая идея со статическими данными
Так что у меня есть постоянно растущая система в PHP, где у меня есть статический класс, который заботится о соединении с базой данных.
<?php
class Database {
// ... connection upon construction and ways of escaping the data
public function query($query) {
// performs query and returns the data.
}
}
class API { // Not actually called api, but for the purposes of this
private static $database = false;
public static function GetDatabase() {
if (static::$database === false) {
static::$database = new Database(connection information)
}
return static::$database;
}
}
?>
У меня также есть много "контроллеров" или адаптеров базы данных, которые выполняют определенные наборы функций.
<?php
class UserDBAdapter {
public function newUser($info) {
// validates and builds the query statements
API::GetDatabase()->query($query);
}
}
?>
Так что реальный вопрос в том, что мне нужен UserDBAdapter здесь и там через код. Скажем, в паре разных файлов и, возможно, в других контроллерах, и я не хочу передавать это как переменную (это может раздражать, когда есть у каждого метода). Я также не хочу создавать 2 из этих объектов (для целей скорости).
Так мог бы я сделать то же самое, что и с объектом $ database. Я не инициализирую их до тех пор, пока они не будут вызваны, что должно быть эффективным, и их не нужно создавать заново на протяжении всего процесса, независимо от объема. По крайней мере, именно поэтому я начал эту идею, но я не знаю, является ли это лучшим идеалом.
Спасибо
2 ответа
Я думаю, что вы делаете хорошо, вы храните соединение с базой данных в реестре, к которому вы можете легко получить доступ в течение всего проекта.
Я думаю, в идеале, вы могли бы перезаписать это с помощью методов setDatabase и getDatabase в других ваших классах, с помощью API::getDatabase() в качестве запасного варианта?
В Zend Framework есть Zend_Db_Adapter::getDefaultAdapter(), который, как я знаю, использовал.. или я назначаю адаптер для реестра с помощью Zend_Registry::set('dbAdapter', $dbAdapter). Я знаю, что вы не используете Zend, но это пример того, как кто-то делает что-то подобное.
Обычно упомянутые вами "контроллеры" управляются как отдельный класс в отдельном файле.
Иногда бывают "синглтоны" одного единственного предмета, используемого во всех приложениях. А иногда, имеют несколько копий, в зависимости от его использования, и называются "сущностями".
Вы можете узнать больше здесь: http://en.wikipedia.org/wiki/Object-Relational_Mapping