Где хранить названия компонентов?

snark

Новичок
Где хранить названия компонентов?

Подскажите, где лучше хранить названия компонентов, непосредственно в классах и брать их вызовом get_name() или где-нибудь во внешнем ассоциативном массиве? Подскажите, как лучше сделать?
 

Духовность™

Продвинутый новичок
лучше конечно в классах, в синглетоне
класс унаследовать от ArrayAccess
и обращаться к этим свойствам как к элементам массива

upd
вот только не знаю, не пробовал ещё - можно ли класс extends ArrayAccess использовать как многомерные массивы? а то мне щас приходится в методах global объявлять для нужных конфигурационных переменных..
 

snark

Новичок
Вот написал такой класс:

PHP:
class Register {
	static $stack;

	/**********************************************************************************************
	* Положить объект в хранилище
	**********************************************************************************************/
	
	static function set_entry($key, &$item)
	{
		Register::$stack[$key] = &$item;
	}

	/**********************************************************************************************
	* Взять объект из хранилища
	**********************************************************************************************/

	static function &get_entry($key)
	{
		return isset(Register::$stack[$key])?Register::$stack[$key]:false;
	}

	/**********************************************************************************************
	* Проверить наличие объекта в хранилище
	**********************************************************************************************/
	
	function is_entry($key)
	{
		return ($this->get_entry($key) !== null);
	}
}
Работа:

PHP:
Register::set_entry("db_drv", new cMySQL(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD));
...
...
...
// 
$db_drv = Register::get_entry("db_drv");
$db_drv->query("select * from table");
Прияяятно стало!
 

Farsh

~ on ~ high ~ wave ~
Осталось все таки добавить "нормальный" Singleton ( а не просто статик ) и, как сказал triumvirat, добавить интерфейс ArrayAccess.
А также понять, почему метод is_entry является не статическим , как остальные в твоем классе;
 

snark

Новичок
Вот нашел "нормальную" одиночку, мог бы кто-нибудь привести пример работы с ним?

Большое спасибо!
 

Farsh

~ on ~ high ~ wave ~
PHP:
$obj = Context::getInstance();

$obj['var1'] = 'value1';
var_dump(isset($obj['var1'])); // true
var_dump($obj['var1']); // 'value1'
unset($obj['var1']);
var_dump($obj['var1']); // NULL
$obj['var1'] = 'value1';
$obj['var2'] = 'value2';
foreach($obj as $k => $v)
{
   print "$k => $v";
} // var1 => value1 и var2 => value2

$obj2 = Context::getInstance();
var_dump($obj2['var2']); // value2
-~{}~ 09.09.08 16:59:

Несовсем мне понятен правда смысл методов save и restore ...
 

snark

Новичок
Farsh, спасибо!

А зачем нужен в нем интерфейс Iterator ???
 

whirlwind

TDD infected, paranoid
> Несовсем мне понятен правда смысл методов save и restore

временное состояние. Кароче грязные хаки, которые в гавнакоде раньше выглядели так

PHP:
global $USERID;
$oldUser = $USERID;
$USERID = 100500;
call_something_which_use_user_Id();
$USERID = $oldUser;
теперь выглядят так

PHP:
$obj = Context::getInstance();
$obj->save('USERID');
$obj->set('USERID',100500);
call_something_which_use_user_Id();
$obj->restore('USERID');
 

Духовность™

Продвинутый новичок
а как научить эту хрень такое делать:

PHP:
$Context = context::getInstance();

$Context['ddd']['dddd'] = 56;

echo $Context['ddd']['dddd'];
 

snark

Новичок
triumvirat, а зачем так нужно???

$Context = context::getInstance();

$Context->set('ddd', (object)array('dddd'=>56));

echo $Context->get('ddd')->$dddd;

Вот!

Лично для меня это прекрасное решение отказа от глобальных переменных.
 
Сверху