sp1se
@sp1se
IT manager

Как правильно написать DB class php?

Доброе время суток!
Я совсем недавно начал изучение php, так что прошу сильно не ругать за "ламерский" вопрос.

Ситуация такая, начал писать проект для друзей, чтоб заодно научится OOP php, и сразу же возник вопрос о правильном class DB. У меня существует несколько таблиц, в которых хранится разная инфа, допустим, users, product. Есть class DB, в котором происходит соединение с базой по mysqli_ в конструкторе и написаны методы select, query..

Есть class Users в котором описаны свойства и методы моих users. И я сейчас, чтоб использовать мой класс DB, сделал class Users extends DB {....} и что-то мне подсказывает, что это неверно, ведь в другом классе, который будет работать с DB, если я тоже присвою DB, то создадутся два соединения..
Хотелось бы понять раз и навсегда, как правильно самому с нуля писать OOP соединения?
  • Вопрос задан
  • 4097 просмотров
Пригласить эксперта
Ответы на вопрос 6
Есть еще такая замечательная штука, PDO.
Ответ написан
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Во-первых, как уже правильно посоветовали - используйте паттерн синглтон, для того, чтобы у класса был только 1 объект.

Во-вторых, сначала опишите архитектуру вашего приложения. Как я понимаю, user и product - это у вас модели. Над моделями проводятся какие-то манипуляции (заполняется данными, редактируются данные или что-то еще), затем новое состояние модели надо записать в базу.
Как раз-таки для реализации вот этой прослойки между моделями и базой я рекомендую почитать про такие паттерны, как Active Record и DataMapper.
Ответ написан
lxfr
@lxfr
Во первых используйте паттерн singleton (в простонародье - одиночка), а помимо этого не забудте, что коннект должен быть всегда лишь один
Во вторых, все возможные параметры - в конфиг
В третьих, делайте проверку указываемых параметров на случай "умного" пользователя или отсутствие коннекта
В четвертых, сделайте нормальный обработчик ошибок запросов
В пятых, внедрите туда защиту (экранирование, к примеру) по запросу метода
Ну и конечно серьезные функции, которые клиент не должен юзать, следует сделать protected

Я хотите вам еще накидаю советов :)
Ответ написан
Комментировать
DrNemo
@DrNemo
Поддержу сингалтон:
При инициализации вы производите подключение к БД
DB::connect($host, $port, ....);
good practice: инициализировать подключение при первом обращение к БД

Дальше в нужных местах проекта (модели, контроллеры) уже выполняете запрос:
$result = DB::query($sql_query, $attr);
Ответ написан
Комментировать
hell0w0rd
@hell0w0rd
Просто разработчик
Сколько же бреда написано.
Вам не нужен синглтон. Вы должны четко разделять грань между тем как данные представлены в php и то, откуда они берутся. Для этого вы можете, например создать класс DB и Repository, который будет принимать экземпляр DB и название таблицы. Вроде как это называется ActiveRecord.
Выгода - вы можете создать еще один Repository, который будет принимать, например, APIBlaBla, и работать с апи какого-то сайта так, будто бы это ваша база данных.
А использование синглтонов в таких вещах, как работа с базами данных/кеш/роутинг/шаблонизация - нарушает все принципы SOLID, ваше приложение будет жестко связано по рукам и ногам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы