PHP - Где лучшее место для инициации класса базы данных? - PullRequest
0 голосов
/ 18 декабря 2008

Я недавно взял свой исходный код Db из __construct моего класса Page и поместил его сразу после того, как я инициировал класс Page. Я удалил его из класса Page, потому что хочу иметь к нему доступ из любого места (например, из других классов). При инициализации он также принимает аргументы сервера, имени пользователя, пароля и базы данных, и я не хочу вводить их каждый раз.

Есть ли способ получить к нему доступ из-под класса Page сейчас? Я попробовал несколько методов, даже глобальных (которые мне сказали, это ужасный способ сделать что-то), и пока что безрезультатно. Я все еще новичок в ОО, но я учу себя как можно лучше.

Должен ли я сделать это статическим классом? Повлияет ли это на ленивый разъем для БД, который я настроил?

Любая помощь будет высоко ценится.

Спасибо

[EDIT]

Аналогичный вопрос: Глобальный или Singleton для подключения к базе данных?

Ответы [ 3 ]

2 голосов
/ 18 декабря 2008

Какой-то глобальный тип (будь то глобальные переменные, синглтон или какой-то другой вариант) является улучшением по сравнению с вашим предыдущим подходом, и поэтому вы на правильном пути. Вообще говоря, вы должны попытаться минимизировать объем состояния программы (по ряду причин, которые я не буду здесь рассматривать). Наличие глобальной переменной противоречит этому принципу. Есть разные решения этой проблемы, но самый мощный и часто упускаемый из виду подход заключается в использовании инверсии управления; Вместо того, чтобы получить зависимость, ваш класс должен получить ее. Например, скажем, у вас есть этот

class EditUserController {
  function saveUser() {
    $db = Database::GetInstance();
    $db->execute("update users set ...", ...);
  }
}

Вы можете изменить это на:

class EditUserController {
  function saveUser($db) {
    $db->execute("update users set ...", ...);
  }
}

Передача зависимостей на уровне функциональных параметров может быть немного громоздкой, поэтому можно пойти на компромисс, чтобы передать ее на уровне объекта:

class EditUserController {
  protected $db;
  function __construct($db) {
    $this->db = $db;
  }
  function saveUser() {
    $this->db->execute("update users set ...", ...);
  }
}

Это довольно распространенный паттерн в ОО-программировании. В дополнение к тому, что он более практичен, чем передача параметров функции, он обладает дополнительным преимуществом разделения конструкции (где совместно используемые зависимости связаны друг с другом) и среды выполнения (где они используются). Это упрощает многие вещи.

0 голосов
/ 14 декабря 2011

Метод singleton был создан для того, чтобы убедиться, что существует только один экземпляр любого класса. Но поскольку люди используют его как способ сокращения глобализации, он становится известен как ленивое и / или плохое программирование.

0 голосов
/ 18 декабря 2008

Глобальные переменные действительно используются, и это будет одна из них. Если, скорее всего, вам не понадобится несколько подключений к базе данных (или даже по-прежнему), то я не вижу проблемы с настройкой глобального объекта $ db.

Альтернативный способ - создать статический класс «Фабрика», который можно использовать для получения объекта. В Joomla 1.5 способ доступа к объекту БД выглядит следующим образом:

$db =& JFactory::getDBO();

функция getDBO проверяет, был ли создан объект БД: если он есть, возвращает ссылку на него, в противном случае подключается и инициализируется, а затем возвращает его.

Это может в равной степени применяться к другим объектам, которые могут быть сделаны глобальными, например, к текущему объекту пользователя.

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