Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
1

База данных в классы или "Меньшее из зол"

04.03.2017, 11:07. Показов 1701. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Пишу API для сайта. Пришел в ступор, когда пришла необходимость использовать базу данных в нескольких классах.
Видел много разных решений и, как не странно, ВСЕ из них были раскритикованы...
Способы:
1. через "синглтон"
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Database
{
    private static $instance;
 
    private function __construct()
    {
        try {
           // PDO Here
           print("Connected!");
        } catch (PDOException $e) {
           die($e->getMessage());
        }
    }
 
    public static function getInstance()
    {
        // Check is $_instance has been set
        if(!isset(self::$instance)) 
        {
            // Creates sets object to instance
            self::$instance = new Database();
        }
 
        // Returns the instance
        return self::$instance;
    }
}


2. Глобальная база данных, которая естественно нарушает принципы ооп
3. Передача базы данных в конструктор класса. Тогда, тут возникает ряд вопросов:
  • можно ли тогда использовать "постоянное соединение"
  • начиная с 5.4 в php нет поддержки на ссылки, т.е. будут копии и как это будет работать, при условии, что на хосте есть ограничение на количество одновременных подключений
  • стоит ли использовать "постоянное подключение" или от него профита никакого

Предварительная структура такая:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
interface IDBController 
{
    public function Add();
    public function Update();
    public function Delete();
}
 
class User implements IDBController
{
    protected $id;
    protected $firstName;
    protected $lastName;
    protected $patronymic;
    protected $email;
    protected $telephone;
    //...
    
    public function __construct(mysqli $db, $id, $accessLevel, $firstName, $lastName, $patronymic, $email, $telephone /*...*/) {
        $this->id = $id;
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->patronymic = $patronymic;
        $this->email = $email;
        $this->telephone = $telephone;
    }
 
    public function __get($name) {
        if ($name == 'id') return $this->id;
        else if ($name == 'firstName') return $this->firstName;
        else if ($name == 'lastName') return $this->lastName;
        else if ($name == 'patronymic') return $this->patronymic;
        else if ($name == 'email') return $this->email;
        else if ($name == 'telephone') return $this->telephone;
        else return NULL;
    }
    
    public function __set($name, $value) {
        if ($name == 'id') $this->id = $value;
        else if ($name == 'firstName') $this->firstName = $value;
        else if ($name == 'lastName') $this->lastName = $value;
        else if ($name == 'patronymic') $this->patronymic = $value;
        else if ($name == 'email') $this->email = $value;
        else if ($name == 'telephone') $this->telephone = $value;
    }
    
    public function Add() {
        
    }
    
    public function Update() {
        
    }
    
    public function Delete() {
        
    }
    
    public static function LoadUser($id) {
        
    }
}
Добавлено через 8 минут
4. Есть еще вариант доп. обертки БД
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
require 'obj_user.php';
require 'obj_a.php';
//...
class DBController
{
    protected $db = null;
 
    public function __construct($host, $user, $password, $database) {
        $this->db = new mysqli($host, $user, $password, $database);
    }
 
    public function Add($obj) {
        if ($obj instanceof User)
        {
           
        }
        else if ($obj instanceof A)
        {
            
        }
        else throw new Exception('Добавление объекта: класс не найден!');
    }
 
        public function Update() {
        
    }
    
    public function Delete() {
        
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2017, 11:07
Ответы с готовыми решениями:

Из двух зол меньшее. AMD Phenom II x6 или AMD FX6300
Доброго дня, народ! Есть два процессора - AMD Phenom II x6 1075T (дома стоит у меня) и AMD FX 6300...

Выбираем меньшее из двух зол (DI vs Copy/Paste)
Всем привет! У меня возникла очень трудная диллема. Есть калькулятор скидки. Скажем, звучит так:...

Из 2 "зол" надо выбрать меньшее
Есть интернет сервис. Я написал программу которая работает с ним. Работа происходит по принципу:...

Классы. База данных с динамическим числом столбцов
Добрый день, вопрос такой: У меня база данных, построенная на двусвязном списке. Там в классе я...

4
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.03.2017, 12:24 2
Цитата Сообщение от darksector Посмотреть сообщение
Видел много разных решений и, как не странно, ВСЕ из них были раскритикованы...
Приходится выбирать между удобным и правильным, идеального решения нет.

Цитата Сообщение от darksector Посмотреть сообщение
public function __construct(mysqli $db, $id, $accessLevel, $firstName, $lastName, $patronymic, $email, $telephone /*...*/)
Если у сущности 30 полей - перечисляем 30 переменных, да ещё и по 30 условий в геттере и сеттере?

И нарушается SOLID, поскольку сущность умеет сама себя сохранять в БД.

Мой вариант (далеко не идеальный):

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Entity()
{
    public function get($name)
    {
        return $this->$name;
    }
    
    public function set($name, $value)
    {
        $this->$name = $value;
    }
    
    public function getState()
    {
        return get_object_vars($this);
    }
 
    public function setState($array)
    {
        foreach($array as $k => $v)
            $this->set($k, $v);
    }
}
 
class EntityMapper
{
    private $db;
    
    public function __construct($db)
    {
        $this->db = $db;
    }
 
    public function getById($id){}
    public function getByParams($array){}
    public function getAll(){}
    
    public function save($entity){} // insert или update в зависимости от заполненности ID
    
    public function deleteByEntity($entity);
    public function deleteByParams($array);
    public function deleteById($entity);
}
Entity - сущность, Mapper - прослойка между сущностью и базой данных.
1
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
04.03.2017, 12:52 3
Лучший ответ Сообщение было отмечено darksector как решение

Решение

Цитата Сообщение от darksector Посмотреть сообщение
как не странно, ВСЕ из них были раскритикованы...
Ничего странного, идеала нет. Но действительно, все 4 описанных вами варианта довольно ужасны. Посмотрите Inversion of Control. Это можно применять не только для работы с БД.
А по поводу БД, посмотрите паттерны Active record и Data mapper.
1
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
06.03.2017, 13:52 4
Цитата Сообщение от Jodah Посмотреть сообщение
поскольку сущность умеет сама себя сохранять в БД.
Говоришь так, будто это плохо...
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
06.03.2017, 14:41 5
andr-xw, с точки зрения SOLID так и есть. А с практической - нарушать первую нормальную форму тоже плохо, но иногда гораздо проще, чем создавать лишнюю таблицу.
0
06.03.2017, 14:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2017, 14:41
Помогаю со студенческими работами здесь

XML или База данных или Что - то ещё?
Доброго времени суток! Есть такая задача: элементу соответствует несколько свойств, например:...

База данных с++ или с#
Всех приветствую, если есть у кого-нибудь база данных на с++ или с# может ли кто-нибудь поделиться...

Enumerations или база данных?
Делаю сервак на java для мобильного приложения(пишется на java и obj-c для 2 платформ). Есть куча...

Массив или база данных?
Доброго времени суток! Очень нужна ваша помощь! Все это делается для автоматизации построения...

База данных или нет?
Всем привет! Я создаю программу: http://open-life.org/blog/1733.html, в ней используются текстовые...

Одна база данных или две
У нас на работе СУБД SQL Server 2008. В одном сервере в одном экземпляре стоят две БД. Одна БД в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru