Соглашения PHP для инкапсуляции и вызовов базы данных - PullRequest
0 голосов
/ 24 апреля 2011

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

Чтобы стандартизировать соединения с базой данных, я создал класс Config со статическим методом getConnection, который создает объект подключения mysqli.Это не проблема, это следующий бит:

Чтобы сделать мои классы более читабельными, в них встроены различные функции, которые делают вызовы базы данных.Например, в моем классе User есть метод getFriends, например, такой:

class User
{
   public $id;

   public getFriends()
   {
      return UserController::getFriends($id);
   }
}

Но в его нынешнем виде, если я реализую его таким образом, это означает создание соединения для каждого запроса на странице, возможно * 1008.* много раз в одном скрипте, что просто ужасно.

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

Я также думал о том, чтобы отказаться от идеи сохранения методов внутри User в целом, ивместо этого следует выполнять вызовы, подобные UserController :: getFriends ($ connection, $ id), непосредственно в скрипте, с единственным объявлением $ connection в начале вместо user-> getFriends ().Это кажется абсолютно чистым, самым хорошим решением, но я не уверен.

Итак, по сути, как PHP-люди обычно делают подобные вещи?

Ответы [ 2 ]

1 голос
/ 24 апреля 2011

Что я делаю в моей инфраструктуре MVC , это создание соединения с БД и назначение его базовому классу Model (в конфигурации):

$db = new database\adapters\MySQL(...);
if ( !$db->connected() ) {
  exit('Ewps!');
}

database\Model::dbObject($db);

Затем, позже,где угодно, я могу использовать:

User::getFriends(13);

, потому что User extends Model и Model имеют доступ к $db: self::dbObject()

Если мне нужно мое соединение с БД, я либо используюModel::dbObject() или $GLOBALS['db'], но мне редко требуется необработанное соединение, потому что вся логика БД должна быть в ваших моделях.

0 голосов
/ 24 апреля 2011

Посмотрите на Singleton Pattern . Он позволяет вам создать класс (объект БД), но когда разрешен только один из них (таким образом, нельзя создать более одного экземпляра).

Это означает, что вам нужно создать только одно соединение с БД, и оно будет общим.

Проверьте здесь для примера кода

...