"Объектно - ориентированный массив" php
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 в контроллере возбуждается исключение"параметр был установлен ранее". Почему так происходит?
хех ... а вы по уроку на хабре делали что ли и код скопировали

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 років тому
Заработало.. Разобрался, теперь работает ). всемоткликнувшимся большое спасибо за внимание !