Это хорошая идея со статическими данными

Так что у меня есть постоянно растущая система в 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

Другие вопросы по тегам