ФорумПрограммированиеPHP для идиотов → Моя версия реестра — lazy registry.

Моя версия реестра — lazy registry.

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 31 января 2010 г. 21:34, спустя 1 минуту 22 секунды

    эдво добрый, другой мог бы охуячить за такие слова
    ιιlllιlllι унц-унц
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 31 января 2010 г. 22:05, спустя 31 минуту 42 секунды

    в сочи приезжайте на пыхослет, отхуячите :)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 31 января 2010 г. 22:07, спустя 1 минуту 30 секунд


    в сочи приезжайте на пыхослет, отхуячите :)
    сначала в Киев, потом а Питер, а вот потом уже можно будет думать насчет Сочей =)))
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 31 января 2010 г. 22:46, спустя 38 минут 50 секунд

    Меня на пыхослете Мавр пиздить будет, я не поеду. Хотя с Днепра тут недалеко.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 31 января 2010 г. 22:51, спустя 4 минуты 59 секунд


    Меня на пыхослете Мавр пиздить будет, я не поеду. Хотя с Днепра тут недалеко.
    эм а где то прозвучала угроза? :)
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 января 2010 г. 23:13, спустя 22 минуты 26 секунд


    пхпшники быдлокодеры, ебошат друг другу ебалы, на пыхослете


    извините, не сдержался
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 31 января 2010 г. 23:28, спустя 14 минут 45 секунд

    mario, ну он как-то агрессивно на мои сообщения реагирует ))

    krasun, оо, отлично.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 31 января 2010 г. 23:47, спустя 19 минут 7 секунд


    mario, ну он как-то агрессивно на мои сообщения реагирует ))

    krasun, оо, отлично.
    ну это не значит что ебало бить будут :))) я думаю до этого не дойдет… Думаю максимум дойдет до того что кто то кого то пошлет :)
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 31 января 2010 г. 23:54, спустя 7 минут 11 секунд

    Абырвалг, пиздеть? нет что ты, я придумаю куда более изощеренное наказание :D
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 1 февраля 2010 г. 3:04, спустя 3 часа 9 минут 44 секунды

    Вспомнил киберспорта почемуто… :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 1 февраля 2010 г. 3:23, спустя 19 минут 17 секунд


    Вспомнил киберспорта почемуто… :)
    я тоже его вспомнил, но почему то решил не упоминать его :) кстати а куда он пропал? :) Вроде бы был-был-был на форуме и раз пропал :(
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 1 февраля 2010 г. 12:47, спустя 9 часов 24 минуты

    adw0rd, да! я их познакомлю :D
    Спустя 34 сек.
    Злой троль тоже пропал, не выдержал критики
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 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ι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 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ι унц-унц
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 7 февраля 2010 г. 13:46, спустя 3 часа 37 минут 21 секунду

    о событиях когдато очень хорошо писал вася_ц

    правда на js но логика отличная
    1. events.txt (81)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!