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

Паттерн Singleton - сделать переменные только readonly для всего сайта

19.06.2016, 15:12. Показов 1583. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Пишу небольшое приложение на PHP и хочу использовать паттерн проектирования Singleton для конфигурационного файла.
Там хранятся private параметры приложения и пару закрытых функций.
Вопрос. Как сделать так, чтобы параметры можно было получить в других классах без зависимостей и чтобы параметры приложения были только для чтения?
Если параметры делать public, то их может изменять кто-угодно.
Если делать private, то возникает ошибка "Fatal error: Cannot access private property WConfig::$dbuser" (в принципе я и не удивлён, что она возникает, но хотелось бы найти компромисс (чтобы параметры можно было спокойно прочитать из любой точки приложения, но нельзя было их перезаписать).
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2016, 15:12
Ответы с готовыми решениями:

Паттерн «Singleton» для настроек программы
Добрый день. Возник такой вопрос, как лучше организовать использование настроек. Вот допустим, есть у меня небольшое приложение по...

Паттерн Singleton
Здравствуйте. Например есть класический одиночка и загрузка музыки. Возможно ли сделать загрузку и вопроизведение музыки через класс...

Паттерн Singleton
Здравствуйте! Подскажите пожалуйста как тут можно реализовать паттерн Singleton? Классы: Pong.java import...

11
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
19.06.2016, 15:36
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test1 {
    private $params = ['param1' => '1'];
    public function __isset($name) {
        return isset($this->params[$name]);
    }
    public function __get($name) {
        return $this->params[$name];
    }
    public function __set($name, $value) {
        throw new Exception('Not allowed');
    }
}
 
$test1 = new Test1;
var_dump(isset($test1->param1), isset($test1->param2), $test1->param1);
try {
    $test1->param1 = 2;
} catch (Exception $e) {
    echo $e->getMessage();
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test2 {
    private $param2 = 2;
    public function __isset($name) {
        return isset($this->$name);
    }
    public function __get($name) {
        return $this->$name;
    }
    public function __set($name, $value) {
        throw new Exception('Not allowed');
    }
}
 
$test2 = new Test2;
var_dump(isset($test2->param2), isset($test2->param3), $test2->param2);
try {
    $test1->param1 = 3;
} catch (Exception $e) {
    echo $e->getMessage();
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test3 {
    private $param3 = '3';
    public function get($name, $default = null) {
        return isset($this->$name) ? $this->$name : $default;
    }
    public function __call($name, $arguments) {
        if ( strpos($name, 'get') === 0 ) {
            $name = strtolower( substr($name, 3) );
            return $this->get($name, isset($arguments[0]) ? $arguments[0] : null);
        }
    }
}
 
$test3 = new Test3;
var_dump($test3->get('param3'), $test3->get('param1', '2'));
var_dump($test3->getParam3(), $test3->getParam1(2));
PHP
1
2
3
4
5
6
7
8
9
class Test4 {
    private $param4 = '4';
    public function getParam4() {
        return $this->param4;
    }
}
 
$test4 = new Test4;
var_dump($test4->getParam4());
0
1 / 1 / 1
Регистрация: 26.09.2014
Сообщений: 42
19.06.2016, 16:10  [ТС]
Всё равно ошибка возникает такая "Fatal error: Cannot access private property WConfig::$dbuser" при
echo Wconfig::$dbuser;
или пустой экран при
echo $Object->dbuser;
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.06.2016, 16:21
Цитата Сообщение от VitautH Посмотреть сообщение
Всё равно ошибка возникает
Где возникает? Покажите свой код, с примером вызова.
0
1 / 1 / 1
Регистрация: 26.09.2014
Сообщений: 42
19.06.2016, 16:22  [ТС]
Вот мой код
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
/**
 * Class WConfig
 *  Конфигурационный статический класс
 */
class WConfig
{
    private static $instance = null;
    protected static $service_db = 'mysql'; //or sqlite
    protected  static $email_admin = 'xxx@mail.ru'; // E-mail администратора
    protected  static  $wsb_storeid= '23456г5'; // Id магазина
    protected static $wsb_secret_key ='23aa4565';
    protected  static $wsb_test = 1;
    protected static $wsb_currency_id = 'BYR';
    protected static $tcpdflib_path = 'tcpdf/examples/accept.php';
    protected  static $dbhost='localhost';
    protected static $dbname= 'nnn';
    private  static $dbuser = 'eee';
    protected static $dbpassword = 'qqq';
    private static $log_path = 'ClassWebPay/log.txt';
 
 
 
 
    /**
     * @return Singleton
     */
    public static function getInstance()
    {
        if (null === self::$instance)
        {
            self::$instance = new self();
        }
 
        return self::$instance;
    }
    /**
     * prevent the instance from being cloned.
     *
     * @throws SingletonPatternViolationException
     *
     * @return void
     */
    final private function __construct()
    {
 
    }
    final private function __clone()
    {
 
    }
 
    /**
     * prevent from being unserialized.
     *
     * @throws SingletonPatternViolationException
     *
     * @return void
     */
    final private function __wakeup()
    {
 
    }
    public function __isset($name) {
        return isset($this->$name);
    }
    public function __get($name) {
        return $this->$name;
    }
    public function __set($name, $value) {
        throw new Exception('Not allowed');
    }
 
}
 
//$Object = Wconfig::getInstance();
//var_dump($Object);
 Wconfig::$log_path = 'kkk';
echo  Wconfig::$log_path;
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.06.2016, 16:31
Вы уже определитесь статический класс у вас или синглтон
Посмотрите const
0
1 / 1 / 1
Регистрация: 26.09.2014
Сообщений: 42
19.06.2016, 16:51  [ТС]
Я думал насчёт констант. В том же Wordpress- константы.
А в Joomla конфиг файл в виде синглтона сделан.
Конечно, можно использовать константы, но хочется найти применение паттернам в моём приложении. Статическая фабрика, синглтон и т.д.
Возможно, что использовать для конфиг файла паттерн синглтон-не самый лучший пример.
В общем я запутался с ними
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.06.2016, 17:13
Дело не в конфиге, а в задаче. В рамках вашей задачи синглтон даст что-нибудь?
Вот статья на эту тему.

И кстати исходники лучше у фреймворков посмотрите, а не cms.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
19.06.2016, 17:47
Цитата Сообщение от VitautH Посмотреть сообщение
Возможно, что использовать для конфиг файла паттерн синглтон-не самый лучший пример.
Нормальный пример. Обычно так и делается. Вот только зачем Вы свойства тут статическими сделали? В синглтоне статический только публичный метод getInstance() и приватное ствойство $instance. Все остальные свойства просто приватные. В синглтоне свойства просто приватные, и работа с ним происходит через Wconfig::getInstance()->log_path, а не Wconfig::$log_path.

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
<?php
/**
 * Class WConfig
 *  Конфигурационный статический класс
 */
class WConfig
{
    private static $instance = null;
    protected  $service_db = 'mysql'; //or sqlite
    protected   $email_admin = 'xxx@mail.ru'; // E-mail администратора
    protected    $wsb_storeid= '23456г5'; // Id магазина
    protected  $wsb_secret_key ='23aa4565';
    protected   $wsb_test = 1;
    protected  $wsb_currency_id = 'BYR';
    protected  $tcpdflib_path = 'tcpdf/examples/accept.php';
    protected   $dbhost='localhost';
    protected  $dbname= 'nnn';
    private   $dbuser = 'eee';
    protected  $dbpassword = 'qqq';
    private  $log_path = 'ClassWebPay/log.txt';
 
 
 
 
    /**
     * @return Singleton
     */
    public static function getInstance()
    {
        if (null === self::$instance)
        {
            self::$instance = new self();
        }
 
        return self::$instance;
    }
    /**
     * prevent the instance from being cloned.
     *
     * @throws SingletonPatternViolationException
     *
     * @return void
     */
    final private function __construct()
    {
 
    }
    final private function __clone()
    {
 
    }
 
    /**
     * prevent from being unserialized.
     *
     * @throws SingletonPatternViolationException
     *
     * @return void
     */
    final private function __wakeup()
    {
 
    }
    public function __isset($name) {
        return isset($this->$name);
    }
    public function __get($name) {
        return $this->$name;
    }
    public function __set($name, $value) {
        throw new Exception('Not allowed');
    }
 
}
 
try {
    Wconfig::getInstance()->log_path = 'kkk';
} catch (Exception $ex) {
    echo "Error! <br>";
}
echo  Wconfig::getInstance()->log_path;
0
1 / 1 / 1
Регистрация: 26.09.2014
Сообщений: 42
19.06.2016, 18:42  [ТС]
Спасибо! Теперь всё нормально и всё понял.
Ещё такой вопрос. Какой паттерн проектирования лучше всего подойдёт для работы с базой данных? Пока тип базы данных только один, но в будущем кол-во поддерживаемых баз данных увеличится.
И ещё не совсем понял паттерны Фабрик. Они занимаются первоначальной инициализацией классов и создают объекты? Пока в раздумье, нужно ли мне использовать Фабрику для своего проекта.
0
Software Engineer
 Аватар для Custos
328 / 328 / 54
Регистрация: 23.09.2014
Сообщений: 976
25.06.2016, 01:21
Цитата Сообщение от VitautH Посмотреть сообщение
Какой паттерн проектирования лучше всего подойдёт для работы с базой данных? Пока тип базы данных только один, но в будущем кол-во поддерживаемых баз данных увеличится.
Возьмите готовое решение и не мучайтесь.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
25.06.2016, 01:58
для конфигурационного файла -> Реестр (Registry)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class Registry
{
    use TSingleton, TStorage;
 
    /**
     * функция инициализации, получили параметры системы из config.ini
     */
    public function init()
    {
        // получили данные конфигурации приложения
        $this->setArray(parse_ini_file(PATH_ROOT . 'config.ini'));
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2016, 01:58
Помогаю со студенческими работами здесь

Паттерн Singleton
Приветствую. Не могу уловить смысл данного паттерна, то есть реализация понятна, но зачем оно нужно? Класс (конструктор) в моем понимании...

Паттерн Singleton
Мне вот дали такой код как паттерн Singleton: #include &quot;stdafx.h&quot; template &lt;class T&gt; class SingletonS { static int...

Паттерн singleton
Показать, что стратегия работает на языке С#. Выручайте ребят, буду благодарна))

Паттерн SingleTon
Прошу привести какой-то пример (с комментами), чтобы я разобрался что это такое и с чем его едят. И как его можно применять...? (ЗЫ гуглил...

Singleton. Одиночка. Паттерн
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: class Play { private: Play(void); ~Play(void);


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru