- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте.
В моей системе все настройки содержаться в JSON файлах. Во время исполнения скрипта, устанавливаются константы вида Название конфигурации (нижнее подчеркивание) название параметра, например, CONF_DB_PASSWORD. Столкнулся с проблемой, что в константу нельзя занести массив, плюс подобные константы не очень выгодно кешировать в память, точнее бесполезно.
Решил использовать ООП для обращения к настройкам и языковым константам.
Обычный объективный __set, __get не подходит. В случае с ним, чтобы получить пароль от базы данных, мне нужно создать объект $conf = new Conf();, потом обратиться к $conf->DB_PASSWORD. То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным. Не подходит.
Интересует статический синтаксис. Например, вместо $conf->DB_PASSWORD хочу писать CONF::$DB_PASSWORD. Как реализовать подобный синтаксис. Все бы так само как и в случае ООП, но методы __get, __set не работают не в объективному контексте.
Если статическая переменная 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 ----------
То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным. Не подходит.
см паттерн Singletone
ivan-lev, да я понимаю как обращаться к ним. Я имею ввиду как сэмулировать __set, __get для статика? То-бишь, чтобы не было ошибки, если я, к примеру, обращусь к не заданному статическому свойству.
Я знаю. Там Instanse записывается в статическое свойство. Но объект все-равно в каждой подпрограмме нужно заново создавать. Т.е., как к статическому не обратишься.
То-есть, либо придется каждый раз создавать новый объект, либо нужно будет объявить его глобальным.
Есть еще вариант юзать синглтон.
---------- Добавлено 20.05.2013 в 20:09 ----------
Но объект все-равно в каждой подпрограмме нужно заново создавать.
Прелесть синглотона как раз в том, что объект создается только один раз на протяжении всего скрипта
siv1987, ну объект же все-равно нужно создавать каждый раз или я что-то не о том думаю?
Смотрите. В начале скрипта я создам $singleton = new Singleton(). Но в другой подпрограмме (в функциях, других классах) доступа к этому объекту не будем, и мне нужно будет опять писать $singleton =...
Ok. Вот пример.
Не доступен в подпрограмме, а нужен глобальный объект (как статический) и с прелестями магических методов.
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();
siv1987, я попутал с другим шаблоном. Ну все-равно я же буду получать объект через метод getInstanse, а мне нужен синтаксис типа CONF::$DB_PASSWORD, а не CONF::getInstanse('DB_PASSWORD'). Понимаете? Иначе это не стоит того. Сейчас у меня CONF_DB_PASSWORD. Но есть потребность в кешировании объектов и во вложенных объектах.
а не CONF::getInstanse('DB_PASSWORD'). Понимаете?
э-э.. посмотрите еще раз на принцип синглтона.
Что такое "кеширование объектов"?
Иначе это не стоит того.
Это и так не очень стоит того.
а мне нужен синтаксис типа CONF::$DB_PASSWORD, а не CONF::getInstanse('DB_PASSWORD'). Понимаете?
Так нужен синтаксис?? =)
или всё же архитектура/логика доступа к данным?
Ну.. и до кучи, с синглтоном Вы так и не разобрались.
Конечно, вопрос может и глупый...
Но почему бы не держать настройки в одном многомерном ассоциативном массиве, который может быть взят из джейсона, либо из базы?
$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'];
Учитывая предыдущую тему: Вы занимаетесь преждевременной оптимизаций!
ivan-lev, спасибо, но таким синтаксисом я сделаю свой код инвалидом.
Милованов Ю.С, мне тоже нравиться этот вариант. Но его нужно будет объявить глобальным + он всегда должен быть установленным. А мне нужна также ленивая подзагрузка. Поэтому, я и подумал об эмуляции __set, __get для статического контекста.
Это плохо? Хотя сам знаю ответ. Работает все превосходно. Но только от одной мысли, что мне нужно что-то переписать в системе пропадает желание вообще что-то делать и сразу хочется спать. :( Но главное - комфорт пользователя.