помогите усовершествовать registry

stanlee

Новичок
помогите усовершествовать registry

Использую простенький класс

PHP:
class registry
{
    private static $objects = array();
    private static $instance;


	public static function singleton()
	{
		if(!isset(self::$instance))
		{
			self::$instance = new self();
        }

        return self::$instance;
    }


    protected function get_object($key)
    {
        if (isset($this->objects[$key]))
        {
            return $this->objects[$key];
        }
        return NULL;
    }


    protected function set_object($key, $val)
    {
        $this->objects[$key] = $val;
    }


    static function get($key)
    {

        return self::singleton()->get_object($key);
    }


	static function set($key, $instance)
	{
		return self::singleton()->set_object($key, $instance);
	}
}
но данная конструкция по сути обычный массив, с очень простыми методами хранения и вызова

PHP:
registry::set('a', 1);
registry::get('a');
может кто то заморачивался над таким вариантом:

допустим хотим сохранить в реестре многомерный массив

PHP:
registry::set('a', array('var1' => 'value1', 'var2' => 'value2', ...));
и вот застрял как вызвать часть массива, чтобы получить value2

сейчас это будет так
PHP:
$a = registry::get('a');
echo $a['var2'];
а хочется что то вроде

PHP:
$value2 = registry::get('a')->var2;
т.е. вытащить из массива нужную ветку а не весь массив и потом присвоить переменной нужное.

есть идеи?
 

Духовность™

Продвинутый новичок
Сейчас тебе предложат использовать ArrayAcess интерфейс, а я скажу, что имитировать объектом работу как с массивом ИМХО - костыль, грозящий проблемами. Я так сделал обертку над массивом примитивного типа: http://www.trevoga.su/arhive/cover_var/

вызовы:

PHP:
$o = new Cover_Var();
$o->append(array('key'=>'value'));
$o->append('PHP');
$o->prepend(array('Ivan'=>new StdClass()));

pr($o->item(0)->Ivan); // StdClass
щас убегаю, если интересно что - спрашивай
 

atv

Новичок
stanlee, посмотри это http://papple.svn.sourceforge.net/viewvc/papple/trunk/PHP_Application/misc/Registry.php?revision=345&view=markup, и тесты к нему, там есть всё что тебе надо, а также поддержка пространств имён.
 

fixxxer

К.О.
Партнер клуба
Усовершенствованный registry - это inversion of control container.

извините (c)

-~{}~ 09.12.09 02:07:

> допустим хотим сохранить в реестре многомерный массив

А не надо хотеть хранить в реестре массивы.

Конфиг - это отдельная песня, сделай класс Config и храни его инстанс.
 

Adelf

Administrator
Команда форума
>> А не надо хотеть хранить в реестре массивы.
+1.


Хорошо что тут не Хабр. Не заминусуют за тупой +1 :)
 

stanlee

Новичок
я пока не определился может и отказаться от массивов правда
но как то мелкий функционал получается

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

AmdY

Пью пиво
Команда форума
stanlee
у тебя функционал - избыточный, достаточно было только статические гет и сет, всё остальное понты, особенно синглетон. слушай фиксера.
PHP:
<?php
class Registry {
    static private $data = array();
    static public function set($key, $value) {
        self::$data[$key] = $value;
    }
    static public function get($key) {
        return isset(self::$data[$key]) ? self::$data[$key] : null;
    }
    static public function remove($key) {
        if ( isset(self::$data[$key]) ) {
            unset(self::$data[$key]);
        }
    }
}
?>
Adelf
на хабре система ущербная, за неделю поправил силу с -10.x до 0, удачно шутил, но обиженные пять раз опустили карму. всё бы ничего, только обсуждать, что-то с пятиминутными слипами неудобно.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Чем это принципиально отличается от

class Registry
{
static public $data = array();
}
 

stanlee

Новичок
AmdY я там проектировал еще под что то, но так и оставил поэтому да там лишнее имеется, пока я не устаканюсь.

хочется чего то максимально простого без паравозов.
пока думаю
 

fixxxer

К.О.
Партнер клуба
в таком виде это вообще мало отличается от $_GLOBALS

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

для проверки на кривость дизайна для начала неплохо заменить set() на add() который запрещает переопределение
 

AmdY

Пью пиво
Команда форума
я всегда подозревал об этом, потому ввёл возможность лочить, но не додумался, что всё что мы кладём должно лочиться _по умолчанию_.
 

stanlee

Новичок
хм а как вы собираетесь лочить и потом это залоченное вытаскивать?
можно примерчик?

мне как то не понятно тк я использую статический класс и кроме как там или вообще закрыться или раскрыться не вижу вариантов.
 

Духовность™

Продвинутый новичок
мне как то не понятно тк я использую статический класс и кроме как там или вообще закрыться или раскрыться не вижу вариантов.
по-русски можно это написать, с запятыми и что бы понятно было?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
я вообще склонен считать registry антипаттерном. если и юзать - то очень осторожно
А если пихать в него обьекты, то получится замечательный ServiceLocator %)

...от которого я отказался в итоге в пользу нормального dependency injection.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
от которого я отказался в итоге в пользу нормального dependency injection.
Ты inject-ишь объект БД во все классы, где нужна база?

-~{}~ 10.12.09 10:20:

и конфиг?
 

Adelf

Administrator
Команда форума
У мну в реестре лежат...
oбьект БД, oбьект Config, oбьект Auth, обьект реестра тоже кстати там же лежит :)
Они много где нужны.. я понимаю что на Глобалс похоже, но все равно реестр - это не антипаттерн :)
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
не антипаттерн
Я согласен. Такие зависимости в коде - это конечно плохо, но можно тронуться умом, запихивая всё нужное в каждый класс
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ты inject-ишь объект БД во все классы, где нужна база?
и конфиг?
Сейчас - да. Когда(Если) меня это будет напрягать, я буду инъектить Dependency Container.
Мало в кого инъектится больше 3 обьектов, а разница в реюзабельности и читаемости для меня выросла многократно, и теперь для меня как раз ServiceLocator субъективно - антипаттерн.
 

fixxxer

К.О.
Партнер клуба
>я понимаю что на Глобалс похоже,

оно не похоже, оно идентично. не стоит обманывать себя объектной обвязкой.

>>но можно тронуться умом, запихивая всё нужное в каждый класс

для этого придуман inversion of control и DI - контейнеры =)

тем более, что если нужного получается много, у тебя архитектура говно %)
 
Сверху