Как вызвать метод объекта по имени переданному в УРЛЕ?

zdimon

Новичок
Как вызвать метод объекта по имени переданному в УРЛЕ?

Подскажите как грамотно сделать примерно следующее

$streval='$ret=$exempl->'.$_GET['method'].'();';

через eval() столкнулся с проблемой отловить фатал ерор в случае несуществующего метода

а задача думаю ясна - передать в адресной строке метод обьекта
 

HraKK

Мудак
Команда форума
if (method_exists($_exempl,$_GET['method']) )
{
$_exempl->$_GET['method']();
}
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
1. Евал это зло.
2. [m]method_exists[/m]

-~{}~ 22.10.07 14:40:

[опоздал]
 

Фанат

oncle terrible
Команда форума
может быть, не стоит передавать в адресной строке метод объекта?
 

HraKK

Мудак
Команда форума
Не вижу принципиальной разницы.
Если есть класс - пользователский интерфейс принимающий action через url.
 

zdimon

Новичок
Автор оригинала: HraKK
if (method_exists($_exempl,$_GET['method']) )
{
$_exempl->$_GET['method']();
}
Дело в том что адресная строка имеет вид ?action=class&method=metod_classa
и мне следовательно это оформить так

$rezult=$class->metod_classa()
 

Фанат

oncle terrible
Команда форума
а может сразу код класса в адресной строке передавать?
чего мелочиться-то?
 

FreeSpace

Чукча-читатель
Ничего плохого в этом нет, если класс этот - контроллер, все публичные методы которых должны обрабатывать запросы пользователей.
Только желательно конечно имя метода нормализировать: как минимум привести к lowercase или camelCase (для удобства разработчика).

Потом проверить, есть ли такой метод у нашего класса-контроллера.

А после этого вызвать что-то типа $controller->$method().

Хотя я нового ничего не добавил, выше уже ответили по всем пунктам, просто я немного разжевал :)
 

StUV

Rotaredom
FreeSpace
речь наверное о том, что имя метода != $_GET['method'], а скорее какой-нить $method === 'action' . $_GET['action'] ?..
а то ведь можно и тупо __construct/__destruct/... передавать =)
 

fast2111

Новичок
А зачем ты хакерам даешь такие подсаказки типа: ?action=class&method=metod_classa

Если у тебя ?action=db&method=select, то я бы предположил что есть и
?action=db&method=drop или clear или вообще __sleep и т.д.
Ты просто больше проблем себе создаешь, нужно кучу проверок и т.д.
Это мое мнение...
Хотябы прячь ?action=0&method=0 (db->0 select->0) уже не понятней...
 

FreeSpace

Чукча-читатель
StUV
Я тоже о контроллере ZF подумал, только упростил пример.
Можно так же по префиксу определять, есть такой экшен или нету, но ведь не обязательно.
Достаточно рассчитывать на то, что любой публичный метод должен быть валидным экшеном.

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

fast2111

Новичок
StUV Я просто хотел сказать что надо быть уверенным что user сможет вызвать только безобидные методы.
И это мое мнение. можете не слушать :)

Как это сказал FreeSpace
Достаточно рассчитывать на то, что любой публичный метод должен быть валидным экшеном.
Извиняюсь за повторнение...
 

Nogrogomed

Новичок
*****, в который раз сталкиваюсь с вашей нелюбовью к конструкциям подобным $$k или $Obj->$method(). Я как-раз таки пользуюсь подобными конструкциями, но объяснения вашей нелюбви к ним так и не нашел. Появились подозрения в безопасности, но конкретных выводов так и нет.

Кто нибудь может прояснить ситуацию (чем плох динамический вызов методов и/или присвоение переменных)? Сразу поясню, что до вызова этих методов идет проверка возможности их вызова.
 

dimagolov

Новичок
Nogrogomed, соображения почему не нужно вызывать методы используя параметры полученные от пользователя до предела просты.
как проверить "можно это сделать или нет"? найти полученный action (метод) в неком массиве разрешенных. Ну а раз у нас есть массив разрещенных, то именно там и нужно хранить что именно вызывать по данному запросу пользователя, а не использовать на прямую то, что он прислал. то есть можем развести имена action-ов, которые отправляет пользователь от имен методов, которые их исполняют.
ну а уж позволять пользователю выбирать объект которым манипулировать в скрипте вообще непонятно зачем, это же внутренняя логика скрипта, о которой клиенту знать вообще ничего не нужно.
 

Nogrogomed

Новичок
Т.е., насколько я понял цель разделения имен экшнов состоит исключительно в сокрытии реальных названий и все?

ну а уж позволять пользователю выбирать объект которым манипулировать в скрипте вообще непонятно зачем, это же внутренняя логика скрипта, о которой клиенту знать вообще ничего не нужно.
Допустим на сайте есть 2 раздела: новости и гостевая книга, и если я например указываю:
Код:
s=News&a=Show
, и при этом после проверок вызывается метод Show объекта класса News - то что в этом плохого? Плюсом этого подхода служит понятность ссылки для разработчиков. Минусом теоретически служит понятность для "недоброжелателей", но чем может обернуться понятность недоброжелателей?
 
Сверху