Дмитрий Б.
7 повідомлень
#16 років тому
Доброго времени суток уважаемые программеры!
Есть необходимость использовать единичный объект (singletone) класса Registry, который применяется для храненения объектов прочих классов, и должен быть доступен в любом месте кода, как стандартный GLOBALS.
Реализация такая же как и здесь (спросил бы там, но нет инвайта..) через singleton, но столкнулся со следующей проблемой: значения свойств класса Registry не могут быть получены, но и не могут быть переустановлены нигде, кроме скрипта, в котором был инициализирован объект Registry в первый раз. Если кто-либо сталкивался - подскажите, как организовать "глобальный" массив средствами ООП.
Заранее благодарен.
Антон С.
89 повідомлень
#16 років тому
Вопрос, на мой взгляд, некорректен. Складывается впечатление, что вы либо слишком торопились, либо слабо понимаете о чем ведете речь.
Изложите все несколько менее сумбурно.
Михаил Г.
231 повідомлення
#16 років тому
Цитата:
значения свойств класса Registry не могут быть получены, но и не могут быть переустановлены нигде, кроме скрипта, в котором был инициализирован объект

в смысле не могут быть получены? это всего лишь массив объектов и переустановить значение и задать не будет проблем, причем это не объязательно массив должен быть, может быть тоже объект
если к примеру есть у вас такой реестр

class Registry
{
private static $_instance;

private function __construct(){}

public function set($key, $value)
{
$this->$key = $value;
}

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

return self::$_instance;
}
}

то работа с ним будет выглядеть так

$reg = Registry::getInstance();
$reg->set('router', new Router);
$reg->router->some_method();

причем объект не обязательно создавать чтоб получить значение ранее установленое, можно получить и утановить его так

Registry::getInstance()->set('router', new Router);
Registry::getInstance()->router->some_method();


Вы задачи не понимаете, у вас должен быть главный контроллер который все соединяет, реестр это не $_GLOBALS, для хранения значений существует множество способов куки, сесии и т.п. или вы не знаете что после исполнения все данные php выгружает(очищает память). ООП тут не причем.
Дмитрий Б.
7 повідомлень
#16 років тому
Спасибо lord_deluxe за содержательный коммент, остальные едко пофлудили) Поставлю вопрос иначе: есть роутер,который подключает контроллеры. При вызове контроллера приходится передавать немало параметров. Я лишь хочу один раз записать параметры в registry и потом в подключаемых контроллерах брать их оттуда.
Сейчас это выглядит так :


<?

class Router{
...
//подключаем произвольный контроллер
$oACTION = new Controller($param1,param2,param3...N);
...
}

?>
А я хочу так :

<?

class Router{
...

$oREGISTRY = Registry :: getInstance();
$oREGISTRY -> set('parm1',$param1);
$oREGISTRY -> set('parm2',$param2);
$oREGISTRY -> set('parmN',$paramN);
...
//подключаем произвольный контроллер
$oACTION = new Controller();
...
}

?>

Мой код аналогичен коду приведенному выше. Но при попытке получить в контроллере записанные в Registry параметры
Registry :: getInstance() -> get('parmN';

значение не возвращается. Более того при переустановке значения parmN в контроллере возбуждается исключение"параметр был установлен ранее". Почему так происходит?
Михаил Г.
231 повідомлення
#16 років тому


Цитата ("borzovich"):
Я лишь хочу один раз записать параметры в registry и потом в подключаемых контроллерах брать их оттуда.

Ну так в чем проблема? все верно, для этого и нужен реестр
Вот примерно если смоделировать вашу ситуацию то это будет так как на рисунке, если я правильно понял, причем вызывать можно параметры и устанавливать можно разными способами. Мне например удобнее работать с параметрами реестра как свойствами объекта, кому то легче с массивом, но разницы нет. Вы что то не то делаете и не предаете этому значение. Смотрите код.
Михаил Г.
231 повідомлення
#16 років тому
Цитата ("borzovich"):
Более того при переустановке значения parmN в контроллере возбуждается исключение"параметр был установлен ранее". Почему так происходит?

хех ... а вы по уроку на хабре делали что ли и код скопировали вы не можете переустановить значение потому что в setter-e стоит проверка
if (isset($this->vars) == true) {

throw new Exception('Unable to set var `' . $key . '`. Already set.');

}

и $vars объявлен как приватный private $vars = array();
Дмитрий Б.
7 повідомлень
#16 років тому
Не.. ну это понятно... Меня интересует почему параметра одновременно и нет(его нельзя получить той же get()) и есть(ведь ругается же, что в массиве значение с таким ключом было установлено раньше)...Без singleton все работает,но я Все же хочу докопаться в чем же бага..
Дмитрий П.
441 повідомлення
#16 років тому
borzovich, ну Вы код-то свой приведите. Класс Registry целиком и пример его использования (как Вы его инициализируете и т.п.)
Дмитрий Б.
7 повідомлень
#16 років тому
Заработало.. Разобрался, теперь работает ). всем
откликнувшимся большое спасибо за внимание !
Михаил Г.
231 повідомлення
#16 років тому
Цитата ("borzovich"):
Заработало.. Разобрался, теперь работает ). всем
откликнувшимся большое спасибо за внимание !

В чем проблема была?