Магические методы __set, __get

12 3
O
На сайте с 29.05.2008
Offline
195
1237

Здравствуйте.

В моей системе все настройки содержаться в JSON файлах. Во время исполнения скрипта, устанавливаются константы вида Название конфигурации (нижнее подчеркивание) название параметра, например, CONF_DB_PASSWORD. Столкнулся с проблемой, что в константу нельзя занести массив, плюс подобные константы не очень выгодно кешировать в память, точнее бесполезно.

Решил использовать ООП для обращения к настройкам и языковым константам.

Обычный объективный __set, __get не подходит. В случае с ним, чтобы получить пароль от базы данных, мне нужно создать объект $conf = new Conf();, потом обратиться к $conf->DB_PASSWORD. То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным. Не подходит.

Интересует статический синтаксис. Например, вместо $conf->DB_PASSWORD хочу писать CONF::$DB_PASSWORD. Как реализовать подобный синтаксис. Все бы так само как и в случае ООП, но методы __get, __set не работают не в объективному контексте.

IL
На сайте с 20.04.2007
Offline
435
#1

Если статическая переменная http://www.php.net/manual/ru/language.oop5.static.php

Conf::$password

Если константа http://www.php.net/manual/ru/language.oop5.constants.php

Conf::PASSWORD

---------- Post added 20-05-2013 at 21:04 ----------

ortegas:
То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным. Не подходит.

см паттерн Singletone

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
O
На сайте с 29.05.2008
Offline
195
#2

ivan-lev, да я понимаю как обращаться к ним. Я имею ввиду как сэмулировать __set, __get для статика? То-бишь, чтобы не было ошибки, если я, к примеру, обращусь к не заданному статическому свойству.

см паттерн Singletone

Я знаю. Там Instanse записывается в статическое свойство. Но объект все-равно в каждой подпрограмме нужно заново создавать. Т.е., как к статическому не обратишься.

siv1987
На сайте с 02.04.2009
Offline
427
#3
ortegas:
То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным.

Есть еще вариант юзать синглтон.

---------- Добавлено 20.05.2013 в 20:09 ----------

ortegas:
Но объект все-равно в каждой подпрограмме нужно заново создавать.

Прелесть синглотона как раз в том, что объект создается только один раз на протяжении всего скрипта

O
На сайте с 29.05.2008
Offline
195
#4

siv1987, ну объект же все-равно нужно создавать каждый раз или я что-то не о том думаю?

Смотрите. В начале скрипта я создам $singleton = new Singleton(). Но в другой подпрограмме (в функциях, других классах) доступа к этому объекту не будем, и мне нужно будет опять писать $singleton =...

Прелесть синглотона как раз в том, что объект создается только один раз на протяжении всего скрипта

Ok. Вот пример.


<?php
$singleton = new Singleton();
class B {
function __construct() {
var_dump($singleton); //NULL
}
}
?>

Не доступен в подпрограмме, а нужен глобальный объект (как статический) и с прелестями магических методов.

siv1987
На сайте с 02.04.2009
Offline
427
#5
ortegas:
siv1987, ну объект же все-равно нужно создавать каждый раз или я что-то не о том думаю?

Объект создаться внутрь класса, а в последующем вы получаете ссылку на этот объект при помощью отведенного метода getInstance() или какого-нибудь другого. А как вы знаете в php5 объекты при присвоении передаются по ссылки.

http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_PHP_5

другая подпрограмма...

$this->conf = Conf::getInstance();

O
На сайте с 29.05.2008
Offline
195
#6

siv1987, я попутал с другим шаблоном. Ну все-равно я же буду получать объект через метод getInstanse, а мне нужен синтаксис типа CONF::$DB_PASSWORD, а не CONF::getInstanse('DB_PASSWORD'). Понимаете? Иначе это не стоит того. Сейчас у меня CONF_DB_PASSWORD. Но есть потребность в кешировании объектов и во вложенных объектах.

siv1987
На сайте с 02.04.2009
Offline
427
#7
ortegas:
а не CONF::getInstanse('DB_PASSWORD'). Понимаете?

э-э.. посмотрите еще раз на принцип синглтона.

Но есть потребность в кешировании объектов и во вложенных объектах.

Что такое "кеширование объектов"?

ortegas:
Иначе это не стоит того.

Это и так не очень стоит того.

IL
На сайте с 20.04.2007
Offline
435
#8
ortegas:
а мне нужен синтаксис типа CONF::$DB_PASSWORD, а не CONF::getInstanse('DB_PASSWORD'). Понимаете?

Так нужен синтаксис?? =)

или всё же архитектура/логика доступа к данным?

Ну.. и до кучи, с синглтоном Вы так и не разобрались.

Conf::getInstance()->getPassword()
## или, если используется __get/__set
Conf::getInstance()->password
Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#9

Конечно, вопрос может и глупый...

Но почему бы не держать настройки в одном многомерном ассоциативном массиве, который может быть взят из джейсона, либо из базы?

$conf['site']['url'] = 'site.ru';

$conf['site']['background']['color'] = '#abcdef';

$conf['site']['background']['url'] = $conf['site']['url'] .'/images/bg.jpg';

$conf['dbms']['user'] = 'root';

$conf['dbms']['password'] = 'passWoRd123';

$conf['dbms']['host'] = 'localhost';

$conf['dbms']['name'] = 'myDB1';

обращаемся очень просто:

echo $conf['site']['background']['url'];

Учитывая предыдущую тему: Вы занимаетесь преждевременной оптимизаций!

Подпись))
O
На сайте с 29.05.2008
Offline
195
#10

ivan-lev, спасибо, но таким синтаксисом я сделаю свой код инвалидом.

Милованов Ю.С, мне тоже нравиться этот вариант. Но его нужно будет объявить глобальным + он всегда должен быть установленным. А мне нужна также ленивая подзагрузка. Поэтому, я и подумал об эмуляции __set, __get для статического контекста.

Вы занимаетесь преждевременной оптимизаций!

Это плохо? Хотя сам знаю ответ. Работает все превосходно. Но только от одной мысли, что мне нужно что-то переписать в системе пропадает желание вообще что-то делать и сразу хочется спать. :( Но главное - комфорт пользователя.

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий