ФорумПрограммированиеPHP для идиотовPHP и ООП → Реестр

Реестр

  • Lirck

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

    Spritz 28 января 2009 г. 20:34

    Сделал класс Registry:
    class Registry
    {
    private static $_instance = null;
    private $_vars = array();

    public static function instance()
    {
           if (self::$_instance == null)
               self::$_instance = new self();
           return self::$_instance;
    }

    public function __get($var)
    {
    if (isset($this->_vars[$var]))
    return $this->_vars[$var];
    }

    public function __set($var, $val)
    {
    if (!isset($this->_vars[$var]))
    $this->_vars[$var] = $val;
    }

    private function __construct() {}
    private function __clone() {}
    }


    Как сделать так, чтобы в результате такой конструкции:

    Registry::instance()->config->lang = 'russian';

    Присваивалось значение $this->_vars['config']['lang'], и выводилось "russian" при такой:

    echo Registry::instance()->config->lang


    Короче говоря $array['blahblahblah']['test']['xzxz'] соответствовало Registry::instance()->blahblahblah->test->xzxz
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 28 января 2009 г. 21:20, спустя 45 минут 42 секунды

    Эм… если я правильно понял, то в случае "config->lang" config является объектом, у которого есть свойство lang.
    Я не совсем понимаю, зачем это нужно и предлагаю не усложнять жизнь и сделать так:
    ->config['lang'];
    UPD: К слову, когда-то были разговоры про возвращаемые значения и тип null. Предлагаю чуток изменить "волшебный метод" __get:

    if (isset($this->_vars[$var])) {
    return $this->_vars[$var];
    } else {
    return null;
    }
  • Trej Gun

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

    Spritz 28 января 2009 г. 21:24, спустя 4 минуты 35 секунд

    aivee, наследуй класс ArrayObject
  • phpdude

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

    Spritz 28 января 2009 г. 21:24, спустя 14 секунд


    Эм… если я правильно понял, то в случае "config->lang" config является объектом, у которого есть свойство lang.
    Я не совсем понимаю, зачем это нужно и предлагаю не усложнять жизнь и сделать так:
    ->config['lang'];
    UPD: К слову, когда-то были разговоры про возвращаемые значения и тип null. Предлагаю чуток изменить "волшебный метод" __get:

    if (isset($this->_vars[$var])) {
     return $this->_vars[$var];
    } else {
     return null;
    }

    нужно чтобы registry->field = registry вот и все.
    Сапожник без сапог
  • phpdude

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

    Spritz 28 января 2009 г. 21:25, спустя 22 секунды


    aivee, наследуй класс ArrayObject
    или так))
    Сапожник без сапог
  • Trej Gun

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

    Spritz 28 января 2009 г. 21:26, спустя 1 минуту 1 секунду

    читай снизу вверх http://mabp.kiev.ua/tag/registry/
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 28 января 2009 г. 21:29, спустя 3 минуты 19 секунд


    нужно чтобы registry->field = registry вот и все.

    Это извращение :D
  • Lirck

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

    Spritz 28 января 2009 г. 21:34, спустя 5 минут 22 секунды

    config['lang']

    Так не работает =)
  • Lirck

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

    Spritz 28 января 2009 г. 21:42, спустя 7 минут 9 секунд

    Registry::instance()->config['test'] = '123';
    echo Registry::instance()->config['test'];

    Notice: Indirect modification of overloaded property Registry::$config has no effect in C:\Program Files\VertrigoServ\www\Registry.php on line 32
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 28 января 2009 г. 22:05, спустя 23 минуты 18 секунд

    Хм.. и вправду.
    Registry::instance()->config = array('test' => '123'); это работает, поскольку мы переменной $var присваиваем значение $val (см. метод set), т.е. прямо присваиваем ей значение, а не работаем, как с массивом.
    Что с моим неудачным примером сделать - без понятия…

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