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

dimagolov

Новичок
Nogrogomed, приведите реальный код проверок при котором НУЖНО использовать переменные полученные от пользователя для обращиния по ним к классам/методам. В крайнем случае где это если не нужно, но реально упрощает код.
 

das6745

Новичок
после проверок
ну так передавай просто код объекта и код действия, ты ведь всеравно проверяеш на валидность. например, dir=1&act=2. даже просто сравнить один символ а не строку будет быстрее, это раз.
2е, и самое важное, а если имя метода у тебя изменится (да, я знаю про интерфесы объектов) то скорее всего и запрашиваемая строка должна будет изменится.
 

Pigmeich

Новичок
Зачем что-то сравнивать?

Заводим массив с указателями на методы класса, ключами - коды передаваемые в GET.

вызываем очень сложный код вроде такого (не проверял спеллчекером, если честно - слишком большой)
PHP:
<?
$myObject->$action[$_GET['code']];
?>
 

das6745

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

fixxxer

К.О.
Партнер клуба
если ты не можешь обойтись без явной передачи действия - делай по скрипту на действие - смысл фронт контроллера тут теряется ибо имена файлов выполняют то же действие гораздо проще. если по умному -этот твой action следует получать по имени (идентификатору) страницы (в самом простом виде это так: у тебя же наверняка есть табличка вида page - title - блаблабла, что мешает туда засунуть action?)
 

Nogrogomed

Новичок
Nogrogomed, приведите реальный код проверок при котором НУЖНО использовать переменные полученные от пользователя для обращиния по ним к классам/методам. В крайнем случае где это если не нужно, но реально упрощает код.
Код для ?dir=News&sec=Show
PHP:
$allow_dirs=array('News', 'Guestbook');

if (in_array($_GET['dir'], $allow_dirs))
$Obj = new $_GET['dir']();
else
// выдаем 404 или создаем объект по умолчанию
в конструкторе класса:
PHP:
finction __construct()
{
$allow_secs= array('Show', 'ShowOne');
if (in_array($_GET['dir'], $allow_dirs))
$this->$_GET['dir']();
else
// выдаем 404 или метод по умолчанию
}
В итоге:
?dir=News&sec=Show - проходит
?dir=News&sec=ShowOne - проходит
?dir=News&sec=Delete - метод не проходит
?dir=Blogs&sec=Show - объект не проходит

Если заменить объекты и методы к ним на цифры или другие обозначения - суть не изменится, и тогда смысл такой замены я не вижу.
 

Nogrogomed

Новичок
если ты не можешь обойтись без явной передачи действия- делай по скрипту на действие
В принципе могу, но как раз таки ищу ответ на вопрос "Почему так не надо делать".

смысл фронт контроллера тут теряется ибо имена файлов выполняют то же действие гораздо проще
Непонял...

если по умному -этот твой action следует получать по имени (идентификатору) страницы
Т.е. по index.php?id=8 я из восьмерки должен вытягивать, что в данном блоке содержится запуск (например) списка новостей? Т.е. я должен узнать, что надо создать объект news и вызвать метод Show? Или тут какой-то другой подход?
 

kvf77

Red Devil
dimagolov
типа если яйца назвать ногами код сразу станет безопасным? че за бред-то?
 

Pigmeich

Новичок
Автор оригинала: das6745
Pigmeich
обычно сравнения проводят для того чтобы определить права на запрашиваемый урл (имхо, в многопользовательских системах). хотя я возможно непонял про "что-то сравнивать"
Под что-то сравнивать я имел в виду запись логических условий.

Если же вы про операции сравнения для индексаци ассоциативного массива, то ответ такой:

Язык у нас интерпретируемый, что создаёт весёлые колизии. Например, скорость выполнения операций на плавающей точке может быть почти равна скорости операций на фиксированных целых. И то и другое, будут существенно медленее операций неинтерпретируемого языка (плюсы)

Отсюда, при оптимизации надо не вдумываться сколько операций занимает индексация или isset, а выносить максимум работы во внешние функции (т.е. встроенные и модулей). Оптимизацию по уменьшению колличества индексаций стоит проводить в последнею очередь и после замера производительности.

Тем более, что ничего удобочитаемого эти числовые коды в код не вносят. Ассоциативные массивы - рулят.
 

dimagolov

Новичок
kvf77 дело не в назывании яиц ногами, а в том, что чем больше подробностей о внутренней структуре мы показываем тем больше вероятность проблем. я не утверждаю, что сокрытие названий методов сразу сделает код безопасным, так же как и их демонстрация автоматом сделает дырявым. но ИМХО никогда нельзя быть абсолютно уверенным, что при определенном стечении обстоятельств (читай в процесе эксплуатации или модификации проекта) у нас не возникнет уязвимость. и вот тут чем больше мы открываем свои внутренности, тем проще ей будет воспользоваться.
 

HraKK

Мудак
Команда форума
dimagolov
Вау, а опен сорсе как же живут?
Надо писать так что б не взломали, а не надеятся на сверхсекретный код.
 

Nogrogomed

Новичок
извиняюсь, что вмешиваюсь в беседу :), но все же хотелось бы узнать недостатки моего кода (с точки зрения не-ООП):
1. идиотизм полный?
2. попрет но нормальные люди так не делают?
3. имеет право на существование?

Просто периодически развиваю систему, и было бы неприятно потом узнать, что копал не в ту сторону.
 

das6745

Новичок
я делал так. передава имя директории , и действе, все чаром. доп параметры - числами, НО! у меня классы и инстансы по имени не совпадают... точнее не всегда. методы тоже. не в совпадении дело, а в юзабилити.
написать так чтоб машина поняла любой дурак сможет... практически любой. а вот чтобы другие программисты или даже пользователи, это уже исскуство.

исходя из гуманных соображений не следует кидатся в крайности, называть все по индексам, и наверное не стоит называть вроде "мой_супер_пупер_мега_класс_откуда_я_дергвю_какието_методы", длинные имена не есть гут, так как вроде они влияют отрицательно на производительность.

На мой взгляд, обращатся в урле к методам и инстансам не есть гуд. Ты ведь планируеш развивать классы? может имена поменяются? а ведь проверку ты в любом случае делаеш.

Ассоциативные массивы - рулят.
http://www.php.lt/benchmark/phpbench.php
 

Pigmeich

Новичок
Nogrogomed
1. Нет. Явно нет.
2. Что есть нормальные люди? Есть допустим, принцип логической целостности данных, по этому принципу использовать данные 'Guestbook' и как имя папки, и как имя метода нельзя, потому что это разные логические сущности.
(Следовательно, могут разделятся, изменятся по отдельности и прочее вредно влияющие на улучшение кода и удобочитаемость)
3. Но ситуация явно не критическая.
 

Altex

Новичок
Автор оригинала: Nogrogomed
извиняюсь, что вмешиваюсь в беседу :), но все же хотелось бы узнать недостатки моего кода (с точки зрения не-ООП):
1. идиотизм полный?
2. попрет но нормальные люди так не делают?
3. имеет право на существование?

Просто периодически развиваю систему, и было бы неприятно потом узнать, что копал не в ту сторону.
На мой взгляд твой подход слишком хардкодный.
Например что будет, если ты вдруг решишь поменять названия методов? Замучаешься переписывать или потеряешь контроль над кодом, что приведёт к появлению уязвимостей.
Второй пример, представь, что у тебя будет две колонки новостей, или у тебя будет такой класс, который явно можно будет использовать не один раз на сайте. Получается, что тебе придётся дублировать код класса. А значит, классы ты тут используешь не по ООП. По ООП ты должен был бы использовать один и тот же класс, но создавать разные объекты и инициализировать их разными данными. А получается, что у тебя для одного класса можно создать только один объект, так как он привязан к параметру в GET.
Вобщем сокрытие названий классов и методов сами по себе на безопасность не сильно влияют, но сильно влияют на архитектурное решение, которое при сокрытии методов и классов получает ещё один слой абстракции, что позволяет использовать ООП по назначению, а не как обычный неймспейс.
 

Nogrogomed

Новичок
понял. спасибо за объяснение.
А до практической реализации ООП я еще не добрался, хотя надумок много.
Благодарю.
 
Сверху