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

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

  • artoodetoo

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

    Spritz 19 февраля 2010 г. 14:57, спустя 11 дней 16 часов 41 минуту

    Edited 2010-02-07: Придумал определение "ленивый реестр". Подправил заголовок. Добавил ссылки по теме.
    Этот реестр может сохранять и возвращать произвольные значения + он может порождать объекты по требованию. Ещё делается попытка спрятать "приватные" данные, например пароль к DB.


    Много писать не буду. Надеюсь код выглядит самодокументированным.
    Файл конфигурации:

    <?php

    return array(
    'classMap' => array(
    'db' => 'MySql',
    ),
    'db' => array(
    'user' => 'ahgsh',
    'password' => 'H78HgasT',
    'prefix' => 'r1220_',
    )
    );

    Код теста:

    <?php

    error_reporting(-1);
    require './lib/qb.php';
    header('Content-type: text/plain');

    // Read configuration & set handlers
    Qb::init();

    // Try to read "secret" info
    echo var_export(Qb::get('db.prefix'), TRUE) . "\n";

    // Build or get already built component
    $db = Qb::load('db');

    // Test component
    echo $db->query('SELECT * FROM :p_topics') . "\n";

    // Try to read "secret" info
    echo var_export(Qb::get('db.prefix'), TRUE) . "\n";

    Выдача:

    'r1220_'
    SELECT * FROM r1220_topics
    NULL



    Ссылки по теме:
    * http://martinfowler.com/eaaCatalog/registry.html
    * http://en.wikipedia.org/wiki/Lazy_initialization
    * http://en.wikipedia.org/wiki/Factory_pattern
    * http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection

    см. v.3 — обработка событий и ленивые объекты
    Subversion: http://subversion.assembla.com/svn/qb7/cuts/registry/

    Код во вложении:
    ιιlllιlllι унц-унц
  • Trej Gun

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

    Spritz 29 января 2010 г. 21:07, спустя 6 часов 9 минут 23 секунды

    закрывай плз ?> а то у меня IDE с ума сходит
  • artoodetoo

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

    Spritz 29 января 2010 г. 21:09, спустя 2 минуты 31 секунду

    не закрываю чтобы не произошел неуловимый и беспощадный высер html. потом ищи этот "Header already set"!
    ιιlllιlllι унц-унц
  • Ewg777

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

    Spritz 29 января 2010 г. 21:17, спустя 7 минут 14 секунд


    закрывай плз ?> а то у меня IDE с ума сходит
    Выкинь свою IDE.
    Сам использую регистрти на базе конфигуратора Zend.
  • Абырвалг

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

    Spritz 30 января 2010 г. 11:50, спустя 14 часов 33 минуты 46 секунд

    CTAPbIu_MABP, по стандартам кодирования Zend закрывающий тег нельзя использовать, если в файле только похапэ-код. Че это за IDE такая?

    artoodetoo, идея интересна. То есть ты как бы совместил Config и реестр. А если у меня 2 соединения с разными базами? Именовать как db1, db2?
  • artoodetoo

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

    Spritz 7 февраля 2010 г. 9:15, спустя 7 дней 21 час 24 минуты

    видимо да — понадобится несколько имён. они могут быть как одного класса, так и разных. всё настраивается через конфиг.
    Спустя 137 сек.
    можно было бы вообще совместить методы get() и load() — тыц!. ведь если мыслить абстрактно, компонент это такой же атрибут приложения, как и параметр конфигурации. пока это слишком смелая идея, современники не оценят ;)

    Update:
    Сообщений: leet
    Шалунишки!
    ιιlllιlllι унц-унц
  • Абырвалг

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

    Spritz 30 января 2010 г. 12:50, спустя 3 часа 34 минуты 39 секунд

    а что если не делать db1, db2 а как-то так:

    QB:get('db'); // вернет инстанцию MySql с настройками default
    QB:get('db', 'default'); // то же самое
    QB::get('db', 'forum') // вернет инстанцию с настройками forum

    Ну и добавить настройку: может быть несколько инстанций или нет.
  • soul

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

    Spritz 30 января 2010 г. 13:02, спустя 12 минут 11 секунд

    я вообще не понимаю зачем усложнять такие классы
    прямого их назначения вполне хватает
  • phpdude

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

    Spritz 30 января 2010 г. 13:03, спустя 1 минуту 19 секунд


    я вообще не понимаю зачем усложнять такие классы
    прямого их назначения вполне хватает
    чтобы слов меньше запоминать
    Сапожник без сапог
  • artoodetoo

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

    Spritz 30 января 2010 г. 19:14, спустя 6 часов 11 минут 1 секунду

    soulgarden, есть такая проблема "слишком большая связанность". Если мы в коде класса A явно упоминаем какой-то класс B, нам будет трудно избавиться от B, например в юнит-тестах для A или при повторном использовании части кода. Но если мы вынесем эти зависимости куда-то вовне, остается только интерфейсная зависимость, т.е. необходимость иметь какой-то класс, с нужными методами.

    Часто проблему решают передавая все нужные объекты через параметры конструктора A. Я же использую общую конфигурацию: упоминаю классы компонент только там. В терминах отсюда мой класс-регистри это «сервис-локатор».

    Ты поймёшь проблему если всерьёз займешся тестированием.  
    Спустя 200 сек.
    Абырвалг, помоему это не проще чем db1 и db2.

    А ещё мой тестовый пример демонстрирует принцип "после прочтения сжечь" :) Параметры конфигурации db_usename и db_password не нужны в момент генерации страницы.
    ιιlllιlllι унц-унц
  • Trej Gun

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

    Spritz 30 января 2010 г. 19:54, спустя 39 минут 38 секунд


    а что если не делать db1, db2 а как-то так:

    QB:get('db'); // вернет инстанцию MySql с настройками default
    QB:get('db', 'default'); // то же самое
    QB::get('db', 'forum') // вернет инстанцию с настройками forum

    Ну и добавить настройку: может быть несколько инстанций или нет.
    какой нахуй регистри, это у тебя уже фабрика
  • Абырвалг

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

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

    @CTAPbIu_MABP

    http://framework.zend.com/manual/ru/zend.registry.using.html
    Че-то я не наблюдаю тут информации о том, что реестр сам может создавать инстанции. То есть изначально реестр тов. artoodetoo не такой уж и реестр.
  • Trej Gun

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

    Spritz 31 января 2010 г. 12:58, спустя 16 часов 53 минуты 11 секунд

    Абырвалг,

    определение регистра в яве

    A well-known object that other objects can use to find common objects and services


    по факту реализация проста как три копейки



    function __autoload($name){
       $path = $_ENV['DOCUMENT_ROOT'] . str_replace("\\","/",$name) . ".php";
       if(file_ exists($path))
           require_once($path);
    }

    class Registry{
       private function __construct(){
       }
       public static function getObject($name){
           if (class_exists($name, true))
               return new $name;
           return null;
       }
    }

    $myClass = Registry::getObject("com\site\pakage\MyClass")


    все остальное уже лишнее
    Спустя 213 сек.

    если по честному то "common objects" для php будут объекты из SPL  
  • artoodetoo

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

    Spritz 31 января 2010 г. 6:39, спустя 17 часов 40 минут 55 секунд

    Абырвалг, тебе просто поговорить хочется?
    У меня в руководстве по машине нет ни слова о том, что BMW 320i это автомобиль. И что?
    Реестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.

    всё как доктор прописал.
    ιιlllιlllι унц-унц
  • Trej Gun

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

    Spritz 31 января 2010 г. 13:00, спустя 6 часов 21 минуту 12 секунд

    artoodetoo, нет он кароче на той стадии когда ему хочется уделать кого-то из знающих чтобы доказать всем что он теперь тоже что-то знает

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