Создание подключения к БД [ООП php]

402
16 марта 2017, 23:43

Начал разбираться с ООП php, а именно с архитектурой MVC. Возник вопрос по подключению к бд. В одном из уроков на данную тему,в модели в функциях взаимодействующих с бд вызывается функция создания объекта PDO, то есть при нескольких действиях с бд на одной странице, создается несколько несколько объектов PDO. Как мне кажется это не правильно. А лучше создать одно подключение и пользоваться им до выполнения всего кода. Но как и в каком месте вызывать данное подключение? Создавать в фронт конроллере или роутере? - но ведь не на каждой странице нужно подключение к бд. Была мысль проверять наличие созданного подключения и если его нет создавать его, но возникли проблемы с видимостью переменной из функций одной модели в функциях другой. В общем как это сделать правильно?

Answer 1

Если в туториале создается несколько несколько объектов PDO, то этот туториал писал дебил. Что, впрочем, не редкость в случае с РНР. А ты совершенно прав - соединение должно создаваться строго только один раз.

Подключение нужно не на каждой странице только если сайт ну совсем уж из куличиков и песочка. В реальности оно тебе будет нужно на каждой странице.

Так что в порядке изучения можешь пока не заморачиваться этим. потом почитаешь про dependency injection - это когда ты создаешь конфиг, в котором пишешь, какому классу какие сервисы нужны - в том числе и подключение к БД. Но пока это тебе, повторюсь, не нужно.

Создавай во фронт контроллере, если больше негде. И дальше передавай в качестве параметра во все создаваемые классы.

Answer 2

Скорее всего вы столкнулись с паттерном Синглтон - созданием единого екземпляра класса БД. Такой объект не создаётся каждый раз, лишь единожды. И далее при обращении к классу проверяется наличие объекта и если он создан - отдаётся, новый не создаётся. В случае с БД его используют очень часто.

class Singleton{
  private static $instance = null;
  private static $i = 0;
  /**
   * @return Singleton
   */
  public static function getInstance(){
    if (null === self::$instance){
        self::$instance = new self();
    }
    return self::$instance;
  }

  private function __wakeup(){}
  private function __clone(){}
  private function __construct(){}
}
$obj = Singleton::getInstance();
READ ALSO
Получение данных html-формы через ajax

Получение данных html-формы через ajax

Вопрос: при заполнении полей формы, срабатывает условие в form_processingphp и выводится значение переменных, а при отправке пустых полей - все равно...

249
Лишние 2 пустые строки во всем проекте Netbeans

Лишние 2 пустые строки во всем проекте Netbeans

Подскажите пожалуйста, во всем проекте появились дополнительные 2 пустые строки, как бы их удалить не в каждом отдельном файле, а во всем проекте...

260
Yii2. Ссылка в gridview для связанных моделей

Yii2. Ссылка в gridview для связанных моделей

ЗдравствуйтеКак сделать ссылку в gridview я знаю, но возникла проблема с ссылкой для связанной модели

460
Многомерный массив, $_SESSION и вывод foreach

Многомерный массив, $_SESSION и вывод foreach

Здравствуйте, подскажите, пожалуйстаЗаполняю массив следующим образом и записываю его в переменную $_SESSION:

288