Создание объекта: "переменные переменные" и функции....

StUV

Rotaredom
Создание объекта: "переменные переменные" и функции....

пусть есть:
PHP:
class foo {
 public function __construct($str) {
  echo $str;
 }
}
function get_class_name() {
 return 'foo';
}
вот это работает:
PHP:
$cname = get_class_name();
$a = new $cname('Hello, World!');
а это - нет:
PHP:
$a = new get_class_name()('Hello, World!');
Есть ли возможность как-либо реализовать второй вариант или нет ?
(т.е. с какими-нибудь скобками или встроенными функциями и тп...)

-----
зы: Первый вариант неустраивает только своей "неестественностью"
 

neko

tеam neko
eval'ом
но это будет не совсем то, но почти
зачем это может быть нужно -- представить трудно вообще
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: StUV
Есть ли возможность как-либо реализовать второй вариант или нет ?
PHP:
eval ('$a = new ' . get_class_name() . '(\'Hello, world\');');
 

neko

tеam neko
да я именно это имел в виду
но остается неясным, что мешает вернуть ссылку на объект?
 

StUV

Rotaredom
2Sad Spirit
Даа.... Заморочка =)
Но все равно Спасибо.

-~{}~ 17.12.04 11:52:

2neko
>> зачем это может быть нужно -- представить трудно вообще

трабл возник при решении задачи динамического назначения некоторому объекту некоторого класса - класса исключения, без агрегации экземпляра этого самого исключения в первоначальный класс:
т.е. в класс агрегируется структура, содержащая имя и параметры класса исключения - данные этой структуры имеет смысл делать защищенными, чтобы была возможность реализации доп. проверок при динамическом изменении имени класса
а в самом первоначальном классе хотелось бы получить что-то вроде:
PHP:
...
try {
...
throw new $this->error_handler->get_class_name($mess);
...
} catch (Exception $e) {
// Do nothing :)
}
...
м.б. можно это реализовать как-то "по-умному" ? :)

-~{}~ 17.12.04 11:56:

зы:
т.е. в программе я делаю
PHP:
$eh = new some_error_handler($eh_type);
$foo = new some_foo($eh, ....);
$foo->do_some();
//Изменяем обработчик:
$eh->change_handler($eh_some_another_type);
//... далее:
$foo->do_some();
думаю идея понятна..... ?
 

neko

tеam neko
неа непонятна
что мешает
PHP:
	class EH
	{
		public function throwMe()
		{
			echo "Throwing...\n";
			throw new Exception();
		}
	}
		
	try
	{
		echo "Trying hard...\n";
		EH::throwMe();
	}
	catch( Exception $exception )
	{
		echo "Catched!\n";
	}
или аналогичное нечто
ну ессно не как статик а по нормальному
 

StUV

Rotaredom
neko
т.е. замещать в объекте агрегированный указатель на объект исключения новым указателем ?
 

neko

tеam neko
брр
агрегированных указателей не бывает :)

смысл моего поста в следующем:

ты из одного объекта хочешь получить имя класса для его исключений после чего сделать new и throw

вместо этого можно эти две операции вынести в метод который собственно это имя возвращает

-~{}~ 17.12.04 15:48:

либо
в методе создавать объект
возвращать ссылку на объект...
и его уже throw
 

StUV

Rotaredom
2neko
спасибо и...
сорри за невнимательность с терминологией =)

---------
зы: в итоге - тупняк - фактически все-равно получаются две операции, объединяемые в один метод (как в "рабочем" варианте из первого поста)
 
Сверху