Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
popryduhin
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
1

Аномалия в моем проекте

25.01.2019, 19:09. Просмотров 446. Ответов 6
Метки нет (Все метки)

Добрый вечер Уважаемые коллеги!

Есть класс, что то напоминает Singleton
Класс предназначен для сохранения и считывания настроек в базе данных.

В проекте есть место где я создаю экземпляр этого класса и кидаю его в DI контейнер.
После работаю с экземпляром.

Вот только какой то парадокс в проекте.

Методы у класса статичные.


После инициализации класса мы получаем его экземпляр.
Да вот только после этой инициализации я почему то могу работать с классом, а не экземпляром

вот так Setting::get('active_theme');

в свойстве self::$db_connect есть объект.
откуда он там взялся?


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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
 
 
namespace Engine\Core\Setting;
 
 
use di;
 
class Setting
{
    /**
     * @var \Engine\DI\DI
     */
    protected static $di;
    private static $db_connect;
    private static $_instance = null;
 
 
 
 
    /**
     * Setting constructor.
     * @param \Engine\DI\DI $di
     */
    public function __construct(\Engine\DI\DI $di)
    {
        self::$di = $di;
        self::$db_connect = self::$di->get('db_connection');
    }
 
 
 
    /**
     * @return Setting
     */
    public static function getInstance()
    {
        if (is_null(self::$_instance)){
            return new self(di::get());
        }
    }
 
 
 
    /**
     * @param $key
     * @param $value
     */
    public static function set($key, $value): void
    {
        self::setValue($key, $value);
    }
 
 
 
    /**
     * @param $key
     * @param bool $default
     * @return mixed
     */
    public static function get($key, $default = false)
    {
        return self::getValue($key);
    }
 
 
 
    /**
     * @param $key
     * @return FALSE|string
     */
    private static function getValue($key)
    {
        $sss = self::$db_connect; // аномалия здесь
    }
 
 
 
    /**
     * @param $key
     * @param $value
     */
    private static function setValue($key, $value): void
    {
 
    }
}

Что то я запутался.


Заблудился в трёх соснах.

Добавлено через 2 минуты
Аномалия в 74 строчке

При вызове метода getValue по идее в свойстве private static $db_connect; должен быть null

Добавлено через 44 секунды
А там объект который я инициализировал совсем в другом классе.

Добавлено через 6 минут
Вот я балбес.

Свойства ведь тоже статичные!!!

Так это что же получается, один раз инициализировал класс и работай с его статичными свойствами?
Видимо я что-то пропустил.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2019, 19:09
Ответы с готовыми решениями:

Ошибки в моем проекте
Писал проект с нуля но почему то выдаются ошибки 4 часа убил .. Может быть покажется легко кому то...

Ошибки Builder в моем проекте
У моего проекта три проблемы. Помогите мне, пожалуйста unsigned int h1 = 0; if (...

Как открыть другую aspx-страницу в моем проекте?
В своем проекте я использую главную страницу, в ContentPlaceHolder которой отображаю мои вложенные...

Подскажите, что в моем проекте не так. Почему выдается ошибка?
Всем доброго времени суток! Мне надо сделать программу. Я не знаю язык Делфи. Учусь по...

в проекте - надо в проекте win32api вынести все в другой *cpp* а не получаеться
определил функцию в другом спп и в основном ругается компилятор

6
sad67man
866 / 671 / 385
Регистрация: 23.08.2015
Сообщений: 1,762
25.01.2019, 20:35 2
popryduhin, Вы видимо немного запутались. Синглтон для того и нужен, чтоб объект инициализировался один раз. Потом вы уже обращаетесь к его свойствам. Они не должны быть статическими. Не до конца понимаю что вы тут делаете, но выглядить это должно примерно так.

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
<?php
 
 
namespace Engine\Core\Setting;
 
 
use di;
 
class Setting
{
    /**
     * @var \Engine\DI\DI
     */
    protected $di;
    private $db_connect;
    private static $_instance = null;
    
    /**
     * Setting constructor.
     * @param \Engine\DI\DI $di
     */
    private function __construct(\Engine\DI\DI $di)
    {
        $this->di = $di;
        $this->db_connect = $this->di->get('db_connection');
    }
 
    /**
     * @return Setting
     */
    public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self(di::get());
        }
 
        return self::$_instance;
    }
 
    /**
     * @param $key
     * @return FALSE|string
     */
    private static function getValue($key)
    {
        //self::getInstance()->db_connect;
    }
 
    /**
     * @param $key
     * @param $value
     */
    private static function setValue($key, $value): void
    {
        //self::getInstance()-> ...
    }
}
0
popryduhin
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
25.01.2019, 20:42  [ТС] 3
sad67man, вот тут я лажанул

PHP
1
2
3
4
5
6
7
8
public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self(di::get());
        }
        
        return self::$_instance;
    }
вы меня поправили.
Спасибо!

Да, я понял смысл.
Мы создаем экземпляр единожды и получаем на него ссылку.


вот исправленная версия

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
 
 
namespace Engine\Core\Setting;
 
 
use Cake\Database\Connection;
use di;
 
class Setting
{
    /**
     * @var \Engine\DI\DI
     */
    private  $di;
    /**
     * @var Connection
     */
    private  $db_connection;
    private static $_instance;
 
 
 
    /**
     * Setting constructor.
     * @param \Engine\DI\DI $di
     */
    private function __construct(\Engine\DI\DI $di)
    {
        $this->di = $di;
        $this->db_connection = $this->di->get('db_connection');
    }
 
 
 
    /**
     * @return Setting
     */
    public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self(di::get());
        }
 
        return self::$_instance;
    }
 
 
 
    /**
     * @param $key
     * @param $value
     */
    public function write($key, $value):void
    {
        self::setValue($key, $value);
    }
 
 
 
    /**
     * @param $key
     * @param bool $default
     * @return mixed
     */
    public function read($key, $default = false)
    {
        $value = $this->getValue($key);
        return !empty($value) ? $value: $default;
    }
 
 
 
    /**
     * @param $key
     * @return FALSE|string
     */
    private  function getValue($key)
    {
        $query = $this->db_connection->newQuery();
        $query->select(['*'])
            ->from('setting')
            ->where(sprintf("name = '%s'", $key))
            ->limit(1);
        return $this->db_connection->query($query->sql())->fetch('assoc')['value'];
 
    }
 
 
 
    /**
     * @param $key
     * @param $value
     */
    private  function setValue($key, $value):void
    {
        // предстоит реализовать...
    }
}
0
sad67man
866 / 671 / 385
Регистрация: 23.08.2015
Сообщений: 1,762
25.01.2019, 20:58 4
popryduhin, Я так понимаю у вас объект отвечает за настройки. Смысл синглтона, если вы в каждом getValue делаете запрос к БД. Логичнее получить все настройки при инициализации. Потом получать уже эти свойства.

Добавлено через 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
32
33
34
35
36
37
38
39
40
41
42
43
44
class Setting
{
    /**
     * @var \Engine\DI\DI
     */
    protected $di;
    private $db_connect;
    private static $_instance = null;
    private $data = [];
 
    /**
     * Setting constructor.
     * @param \Engine\DI\DI $di
     */
    private function __construct(\Engine\DI\DI $di)
    {
        $this->di = $di;
        $this->db_connect = $this->di->get('db_connection');
 
        $query = $this->db_connection->newQuery()
            ->select(['*'])
            ->from('setting')
            ->limit(1);
 
        $this->data = $this->db_connection->query($query->sql())->fetch('assoc');
    }
 
    /**
     * @return Setting
     */
    public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self(di::get());
        }
 
        return self::$_instance;
    }
 
    private static function getValue($key)
    {
        return self::getInstance()->data[$key];
    }
}
Добавлено через 13 секунд
PHP
1
2
$phone = Settings::getValue('phone');
$email = Settings::getValue('email');
0
popryduhin
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
25.01.2019, 21:00  [ТС] 5
sad67man, Планируется получать настройки в любом месте и в разное время.
По поводу частых обращений в базу данных, я думаю что буду задействовать кеширование.

Например

Проект разделен на окружения
Каждое окружение имеет свою конфигурацию и в разных объемах.
Поэтому, смысл все сразу грузить?

Добавлено через 2 минуты
[n
Цитата Сообщение от sad67man Посмотреть сообщение
Я так понимаю у вас объект отвечает за настройки. Смысл синглтона, если вы в каждом getValue делаете запрос к БД. Логичнее получить все настройки при инициализации. Потом получать уже эти свойства.
На этот счёт я думаю что можно реализовать гибкую выборку конфигураций.

К примеру, перечислить список имён параметров и выбрать только актуальные.
0
sad67man
866 / 671 / 385
Регистрация: 23.08.2015
Сообщений: 1,762
25.01.2019, 21:01 6
popryduhin, Тогда не вижу смысла в синглтоне. Вы же ничего не выигрываете.
0
popryduhin
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
25.01.2019, 21:07  [ТС] 7
Цитата Сообщение от sad67man Посмотреть сообщение
Тогда не вижу смысла в синглтоне. Вы же ничего не выигрываете.
Да мне и не нужно нечего выигрывать
Есть некий класс Setting.
Получил его экземпляр.
Работаю себе на здоровье.

Вы наверное имеете в виду, почему именно Singleton?

мне его instance нужен в любых местах приложения.
0
25.01.2019, 21:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2019, 21:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Аномалия
На одном компьютере так,а на другом по-другому...С чем это может быть связано? (я про зеленый...

Аномалия с жд
2 дня назад заметил проблему, компьютер внезапно грузился 5 минут, но все-же загрузился и оказалось...

RichEdit аномалия
Ребят, наткнулся на UFO в RAD XE3...я тут не знаю, может так должно быть....вобщем описание такое...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.