2011-12-14 7 views
3

Итак, у меня есть постоянно растущая система на 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. Я не инициализирую их до тех пор, пока они не будут вызваны, что должно быть эффективным, и их не нужно воссоздавать на протяжении всего процесса, и независимо от его объема. По крайней мере, поэтому я начал эту идею, но я не знаю, лучший ли это.

Благодаря

+0

Считаете ли вы использование ORM, такого как [доктрина] (http://www.doctrine-project.org/)? Похоже, это в основном то, что вы пытаетесь реализовать. – lakenen

+0

Ваш «пользователь» означает «пользователь базы данных», который вы подключаете, или какой-либо «объект/объект/данные», который вы используете в своем приложении? – umlcat

ответ

2

Я думаю, что вы делаете это хорошо, вы храните соединение с базой данных в реестре вы можете легко получить доступ на протяжении всего проекта.

Я предполагаю, что в идеале вы можете перезаписать это с помощью методов setDatabase и getDatabase в других ваших классах с API :: getDatabase() в качестве резервной копии?

Zend Framework имеет Zend_Db_Adapter :: getDefaultAdapter(), который, как мне известно, используется .. или я назначаю адаптер в реестр с помощью Zend_Registry :: set ('dbAdapter', $ dbAdapter). Я знаю, что вы не используете Zend, но это пример того, кто делает что-то подобное.

0

Обычно, «контролеры» вы упоминаете управляются как отдельный класс в отдельном файле.

Иногда, «одиночные», один предмет, используемый во всех приложениях. И иногда, имеют несколько копий, в зависимости от их использования, и называются «сущностями».

Вы можете узнать больше здесь: http://en.wikipedia.org/wiki/Object-Relational_Mapping

+0

Нет UserDBAdapter выполняет операции над базой данных вокруг рядов пользователей. Итак, изменение имени (передача в uid и имя), смена пароля, регистрация, бла-бла-бла. Все, что связано с самим пользователем, будет в пользовательском адаптере DB. Я знаю, что они находятся в отдельном файле, но я использую очень простой редактор, stackoverflow.com, и я действительно не хочу ехать в город. Предположим, что это «представление». В любом случае, конечно, одноэлементный узор. Мне очень нравится это. Я совсем забыл об этом :) – Michael

+0

Я помню, почему мне нравится то, что я делаю, и почему я не пошел с Синглтоном. Иногда я использую более одного подключения к базе данных. Поэтому я хочу использовать любое количество баз данных. – Michael

Смежные вопросы