Всем привет! Мне по работе передали один проект на великом и могучем PHP. Обычное веб-приложение. Но очень много работы с БД - много разных выборок и вставок для каждой группы данных. Посколько кода много (сотни функций, автор разбил работу с БД на разные классы по сущностям: пользователи, группы, логи...
Чтобы не «тащить» за собой всегда кучу экземпляров разных классов, он создал один главный класс «dtb» конструктору которого передает ссылку на подключение к базе, а он в свою очередь заполняет свои public поля экземплярами других классов.
Выглядит очень странно:
/* Класс поля которого ($user, $log, ...) будут содержать
экземпляры других классов для работы с БД
*/
class dtb {
public $user = null; // экземпляр класса dtbUser
public $log = null; // экземпляр класса dtbLog
// и еще десяток разных
private function __construct(&$connectionLink) {
if ($connectionLink instanceof MongoDB) {
$this->user = new dtbUser($connectionLink);
$this->log = new dtbLog($connectionLink);
// ...
}
else
trigger_error('wrong connection', E_USER_ERROR);
}
}
class dtbItem {
protected $db = null;
function __construct(&$connectionLink)
$this->db = $connectionLink;
}
class dtbUser extends dtbItem{
public function getOne() {
$coll = $this->db->selectCollection('users');
$obj = $coll->findOne();
return $obj;
}
// куча других функций
class dtbLog extends dtbItem{
public function getTwo() {
$coll = $this->db->selectCollection('log');
$obj = $coll->findOne();
return $obj;
}
// куча других функций
}
/* Работает это так: */
$conn = new MongoClient();
$dtbs = new dtb($conn);
var_dump( $dtbs->user->getOne() );
var_dump( $dtbs->log->getTwo() );
Беда этого способа в том, что из класса dtbUser нельзя получить методы класса dtbLog и проектировщик каждый раз описывал всё заново в каждом классе.
А как правильно в PHP реализуется работа с БД когда очень много (сотни) функций получения данных?
И вообще, как правильно в PHP реализуется работа с БД?
p.s. класс dtb инстанцируется как синглтон (но это не важно)