Дизайн класса абстракции базы данных с использованием PHP PDO

Я занимаюсь разработкой веб-приложения (действительно, это хобби, и я пытаюсь научить себя дизайну, и что лучше, чем делать это:). Во всяком случае, я думал о том, как я буду иметь дело с моей базой данных. Мне комфортно с PDO, и я думал об использовании PDO в моем классе абстракции. Я думаю о создании синглета, так что есть только одно соединение с базой данных. Этот синглтон создаст соединение PDO.

После этого я не понимаю, почему мне нужно делать слишком много. Затем я могу использовать обработчик базы данных для вызова функций PDO. Мне могут понадобиться некоторые вспомогательные функции, но когда это сработает, я просто буду использовать PDO для фактических SQL-запросов.

Что-то не так с этим подходом? Это кажется чрезмерно простым по сравнению с классами абстракции, которые я использовал.

Ответ 1

Вам не нужен Синглтон.

База данных Singleton не решит проблемы concurrency. Во всяком случае, он может убедиться, что у вас есть только один экземпляр PDO для запроса, в котором он был создан. И он обеспечивает глобальный доступ, который многие считают плохой. Кроме того, вам нужно приложить дополнительные усилия при тестировании Singleton.

Просто создайте обертку, которая ленив соединяет и сохраняет экземпляр, когда это необходимо в вашем загрузочном блоке, и установите экземпляр на DAL supertype, например TableDataGateway. Кроме того, таким образом вы не ограничиваете себя только одним экземпляром PDO, если вам понадобится второй в какой-то момент.

Ответ 2

Возможно, это кажется вам так просто, потому что PDO - это, по сути, класс абстракции базы данных. Это означает: работа уже выполнена.

Ответ 3

Да, это хорошее начало. PDO + singleton является часто используемым и отличным сочетанием. Поскольку мне лично не нравится весь ввод текста, чем использование синглетов, я написал очень легкий класс базы данных.

Он вводит только две дополнительные функции в PDO: доступ к (ленивому) экземпляру PDO с использованием __callStatic (DB::query() вместо DB::instance()->query()) и две функции для упрощения цитирования (DB::q('INSERT INTO table (name) VALUES (?s)', $_POST['insecure_name'])). Может быть, вы хотите посмотреть на оба, это действительно удобно;)

Ответ 4

Вы также можете быть заинтересованы в проекте php-pdo-wrapper-class. Это легкий класс базы данных, который расширяет PDO, добавляя несколько методов - вставлять, обновлять, удалять, выбирать (и несколько других) - для упрощения общих операторов SQL. Я использовал этот проект в своей разработке и очень рекомендую.