Форум → Программирование → PHP для идиотов → Моя версия реестра — lazy registry.
Моя версия реестра — lazy registry.
Страницы: ← Предыдущая страница • Следующая страница →
-
31 января 2010 г. 21:34, спустя 1 минуту 22 секунды
эдво добрый, другой мог бы охуячить за такие словаιιlllιlllι унц-унц -
-
31 января 2010 г. 22:07, спустя 1 минуту 30 секунд
сначала в Киев, потом а Питер, а вот потом уже можно будет думать насчет Сочей =)))
в сочи приезжайте на пыхослет, отхуячите :) -
31 января 2010 г. 22:46, спустя 38 минут 50 секунд
Меня на пыхослете Мавр пиздить будет, я не поеду. Хотя с Днепра тут недалеко. -
31 января 2010 г. 22:51, спустя 4 минуты 59 секунд
эм а где то прозвучала угроза? :)
Меня на пыхослете Мавр пиздить будет, я не поеду. Хотя с Днепра тут недалеко. -
31 января 2010 г. 23:13, спустя 22 минуты 26 секунд
пхпшники быдлокодеры, ебошат друг другу ебалы, на пыхослете
извините, не сдержался -
31 января 2010 г. 23:28, спустя 14 минут 45 секунд
mario, ну он как-то агрессивно на мои сообщения реагирует ))
krasun, оо, отлично. -
31 января 2010 г. 23:47, спустя 19 минут 7 секунд
ну это не значит что ебало бить будут :))) я думаю до этого не дойдет… Думаю максимум дойдет до того что кто то кого то пошлет :)
mario, ну он как-то агрессивно на мои сообщения реагирует ))
krasun, оо, отлично. -
31 января 2010 г. 23:54, спустя 7 минут 11 секунд
Абырвалг, пиздеть? нет что ты, я придумаю куда более изощеренное наказание :D -
1 февраля 2010 г. 3:04, спустя 3 часа 9 минут 44 секунды
Вспомнил киберспорта почемуто… :)https://smappi.org/ - платформа по созданию API на все случаи жизни -
1 февраля 2010 г. 3:23, спустя 19 минут 17 секунд
я тоже его вспомнил, но почему то решил не упоминать его :) кстати а куда он пропал? :) Вроде бы был-был-был на форуме и раз пропал :(
Вспомнил киберспорта почемуто… :) -
1 февраля 2010 г. 12:47, спустя 9 часов 24 минуты
adw0rd, да! я их познакомлю :DСпустя 34 сек.Злой троль тоже пропал, не выдержал критики -
7 февраля 2010 г. 9:17, спустя 5 дней 20 часов 29 минут
[h3]Объекты и простые значения добываем одинаково[/h3]
Я ещё поковырял тему немного. Теперь конфиг содержит секцию 'components', где указаны имена компонент, их классы и параметры инициализации. Приватные параметры подставляются в конструкторы и больше никуда! Чтобы по неосторожности не просрать пароли :)
Универсальный метод get() возвращает либо простое значение из конфигурации, либо целое под-дерево, либо объект из реестра. Объекты создаются на лету, как если бы они уже хранились в конфиге.
Конфиг
<?php
return array(
'components' => array(
'db' => array(
'MySql',
'host' => 'localhost',
'base' => 'test',
'user' => 'ahgsh',
'password' => 'H78HgasT',
'prefix' => 'r1220_',
),
'another.obj' => array(
'SomeAnotherClass',
),
),
'some' => array(
'parameters' => array(
'A' => 256,
'B' => 'google moogle',
),
),
);
Умный get.
public static function get($alias, $default = NULL)
{
if (strpos($alias, 'components.') === 0)
throw new Exception('Atempt to hack!');
// Try to find tree node for this alias
$ref =& self::$_registry;
foreach (explode('.', $alias) as $name) {
if (isset($ref[$name])) {
$ref =& $ref[$name];
} else {
// Not found
unset($ref);
break;
}
}
// Not found. Is it component reference?
if (!isset($ref) && isset(self::$_registry['components'][$alias])) {
$args = self::$_registry['components'][$alias];
$class = array_shift($args);
self::set($alias, $ref = new $class($args));
}
return isset($ref) ? $ref : $default;
}
Конечно есть накладные расходы, но помоему, выгода всё-таки есть.
http://framework.zend.com/manual/ru/zend.registry.using.htmlРеестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.
Класс отвечает этому определению. Он хранит "объекты" и "значения", которые будут доступны из любого места. У класса область видимости глобальная, поэтому выбрана реализация через "статический класс".
Вы можете помещать объекты в реестр (set) и затем получать их по имени (get). В отличие от Zend, здесь можно описать предопределённые значения и объекты через файл конфигурации. Для объектов задается класс и набор параметров конструктора. Мы можем вынести из кода приложения привязку объекта к конкретному типу — то есть уменьшаем общую связанность.ιιlllιlllι унц-унц -
7 февраля 2010 г. 10:08, спустя 51 минуту 27 секунд
[h3]Обработка событий + ссылки на ещё не существующие объекты[/h3]
Наш реестр-фабрика умеет возвращать объект по его имени.
$obj = Qb::get('another.obj');
В момент получения ссылки нас не волнует был ли объект засунут в реестр методом set() или он был описан в "конфигурации", существует ли он или будет создан прямо сейчас. Нам просто нужен объект!
Захотелось добавить обработку событий. Пускай события задаются и поджигаются так:
Qb::attachEventHandler('onBeep', array($b, 'myHandler1'));
// … … …
Qb::raiseEvent('onBeep'); // вызовутся все подвешенные на 'onBeep' обработчики
Второй аргумент в attachEventHandler задается в формате, подходящем для call_user_func(), т.е. это может быть
1. имя-callback-функции, либо
2. {объект, имя-метода}, либо
3. {имя-статического-класса, имя-метода}
Для варианта (2) мы должны создать объект перед регистрацией обработчика. А ещё не факт, что событие вообще состоится! Тут на помощь приходит наш "реестр ленивых объектов" :)
В новой версии реестра есть "события" и секция конфига для них.
return array(
// …
'components' => array(
'another.obj' => array(
'SomeAnotherClass',
'caption' => 'Hello world!',
),
),
// …
'events' => array(
'onSleep' => array(
array('ClassA', 'myHandler2'),
),
'onBeep' => array(
array('another.obj', 'myHandler1'),
),
),
// …
);
или мы можем регистрировать обработчик динамически, не создавая сам объект
Qb::attachEventHandler('onBeep', array('another.obj', 'myHandler1'));
кусок raiseEvent():
foreach ($e[$name] as $handler) {
// Is handler defined via "object alias" ?
if (is_array($handler) && is_string($handler[0]) && isset(self::$_components[$handler[0]])) {
$handler[0] = self::get($handler[0]);
}
$result = call_user_func($handler, $event) || $result;
}
То есть мы получили возможность ссылаться на методы объектов, которые ещё не создали. Такая вариация на тему ленивой инициализации. Думаю будет полезно для всяких систем с plugin-ами.
См. вложение.ιιlllιlllι унц-унц -
7 февраля 2010 г. 13:46, спустя 3 часа 37 минут 21 секунду
о событиях когдато очень хорошо писал вася_ц
правда на js но логика отличная
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!