Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 30.04.2014
Сообщений: 13

Одно соединение с БД для всех классов

19.09.2017, 13:12. Показов 975. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую участников форума!
Вообщем сейчас в коде присутствует примерно такой говнокод:
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
class Database
{
    function __construct()
    {
        $this->db_handle = mt_rand(); //initialize connection
    }
}
 
 
class Foo extends Database
{
    function hello()
    {
        return "This class " . get_class($this) . " are " . $this->db_handle;
    }
}
 
class Bar extends Database
{
    function hello()
    {
        return "This class " . get_class($this) . " are " . $this->db_handle;
    }
}
 
$foo = new Foo();
echo $foo->hello();
$bar = new Bar();
echo $bar->hello();
Необходимо сделать так, чтобы классы Foo и Bar использовали одно подключение к БД, в итоге у меня получилось реализовать через замыкания:
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
class Foo
{
    function __construct($db_handle)
    {
        $this->db_handle = $db_handle;
    }
 
    function hello()
    {
        return "This class " . get_class($this) . " are " . $this->db_handle;
    }
}
 
 
class Bar
{
    function __construct($db_handle)
    {
        $this->db_handle = $db_handle;
    }
 
    function hello()
    {
        return "This class " . get_class($this) . " are " . $this->db_handle;
    }
}
 
class Init
{
    function __construct($db_handle)
    {
        $this->db_handle = $db_handle;
    }
 
    function getInstance($className)
    {
        return new $className($this->db_handle);
    }
 
    static function connectDB()
    {
        $db_handle = mt_rand(); // create single connection
        return new Init($db_handle);
    }
}
 
 
$init = Init::connectDB();
$foo = $init->getInstance("Foo");
echo $foo->hello();
$bar = $init->getInstance("Bar");
echo $bar->hello();
Какие еще есть варианты решения, кроме создания пула соединений(объем обработки не такой большой), данной задачи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2017, 13:12
Ответы с готовыми решениями:

Одно MenuStrip для всех форм
Здравствуйте. Подскажите пожалуйста, у меня есть Form1, на которой я создал MenuStrip и есть Form2. Как мне сделать, чтобы это MenuStrip...

одно меню для всех страниц
Как сделать чтобы меню(ссылки) в блоке div само менялось на всех дочерних страницах если я его меняю на главной, чтобы не делать это на...

Одно оформление для всех операционных систем
Как сделать, чтобы оформление интерфейса было одинаковым во всех операционных системах?

6
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
19.09.2017, 14:05
Мммм... может скажу ерунду (не так давно изучаю ООП), но может быть тут поможет паттерн Синглтон? Типа вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Database {
    private $instance;
    private $conn;
    private __construct() {
        //Соединяемя с бд
        $this->conn = mt_rand(0, 100);
    }
    
    public static function getInstance() {
        if (!$this->instance()) {
            $this->instance() = new Database();
        }
        return $this->instance;
    }
    
    public function getConnection() {
        return $this->conn;
    }
}
Тогда и Foo и Bar могут получать соединение таким образом:
PHP
1
$conn = Database::getInstance()->getConnection();
Если не прав, поправьте

Добавлено через 6 минут
И при этом ни Foo ни Bar не должны наследоваться от Database. Разделяем ответственность
1
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
19.09.2017, 14:16
Цитата Сообщение от legkoe_poxmelye Посмотреть сообщение
Какие еще есть варианты решения
1. Сервис контейнер, который сам разрешит зависимости между классами. Тогда не будет надобности в методе getInstance().
Понять суть можно в доках по Laravel и Yii (например https://laravel.ru/docs/v5/container), затем взять любой готовый контейнер с гитхаба.

2. Как сказали выше, синглтон.
1
0 / 0 / 1
Регистрация: 30.04.2014
Сообщений: 13
19.09.2017, 16:07  [ТС]
Jodah,
Правильно ли я понимаю, при использовании контейнера просто инициализировать класс с ДБ объектом?:
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
<?php
 
class Database
{
    function __construct()
    {
        $this->db_handle = mt_rand();
    }
 
    function query($arg)
    {
        ;
    }
}
 
 
class Foo
{
    function __construct(Database $db)
    {
        $this->db = $db;
    }
 
    function getDbHandle()
    {
        return $this->db->db_handle;
    }
}
 
 
// client code
 
$db = new Database();
$foo = new Foo($db);
echo $foo->getDbHandle();
Добавлено через 1 час 0 минут
Похоже дошло что вы имели ввиду, это - IoC, http://www.itlessons.info/php/... f-control/
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
19.09.2017, 16:16
Цитата Сообщение от legkoe_poxmelye Посмотреть сообщение
Правильно ли я понимаю, при использовании контейнера просто инициализировать класс с ДБ объектом?:
Верно, только вместо new будет вызов контейнера. Что-нибудь вроде:
PHP
1
$foo = $container->make('Foo');
Цитата Сообщение от legkoe_poxmelye Посмотреть сообщение
это - IoC
Да.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.09.2017, 08:25
По поводу контейнера; этот можно использовать: https://pimple.symfony.com

Только этот самый контейнер всё равно придётся в качестве аргумента всем классам (которым он нужен) передавать.
0
0 / 0 / 1
Регистрация: 30.04.2014
Сообщений: 13
20.09.2017, 10:07  [ТС]
Да мне бы вообще спрятать за кулисы классов Foo и Bar экземпляр объекта базы данных, у меня получилось на основе синглтона который Зверушь предложил:
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
class DB
{
    static $_instance = null;
    function __construct()
    {
        $this->db_handle = mt_rand();
    }
 
    static function getInstance()
    {
        if(is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}
 
class Foo
{
    function __construct()
    {
        $this->db = DB::getInstance();
    }
 
    function hello()
    {
        return "This is a " . get_class() . " with " . $this->db->db_handle;
    }
}
 
 
class Bar
{
    function __construct()
    {
        $this->db = DB::getInstance();
    }
 
    function hello()
    {
        return "This is a " . get_class() . " with " . $this->db->db_handle;
    }
}
 
$foo = new Foo();
$bar = new Bar();
 
echo $foo->hello();
echo "<br>";
echo $bar->hello();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2017, 10:07
Помогаю со студенческими работами здесь

Основной класс, для наследования от него данных для всех остальных классов
Здравствуйте, как удобным способом сделать класс в котором будут проинициализированы некоторые поля (например, имя сервера к которому...

Обработка исключений на форме - одно для всех ошибок
Доброго времени суток, уважаемые форумчане. Пробую разобраться с try...throw...catch. В целом, как это делается в консольных проектах и...

Страничный шаблонизатор. Для всех страниц выводится одно и то же
Привет всем, мастера PHP. У меня проблема. Сделал шаблонизатор со страницами: &lt;?php if(!defined('BLOG')) die('some error...

Как прописать одно условие для всех CheckBox
Подскажите пожалуйста: у меня порядка 100 CheckBox, как прописать одно уловие для всех моих CheckBox. Вот мой код: Private Sub...

Общее свойство для всех классов
Был у меня набор скриптов, которые производили определенные действия и всем им было нужно соединение с базой данных. Поэтому я сделал...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru