Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Имя функции из переменной
Форумы портала PHP.SU » » HTTP и PHP » Имя функции из переменной

Страниц (2): [1] 2 »
 

1. Schupp - 23 Сентября, 2011 - 01:27:23 - перейти к сообщению
Прошу помощи, ибо в полном ступоре сейчас...

Такая ситуация. Есть некоторое количество функций. Пусть названия будут func1, func2 и т.д. Есть формы на различных страницах, кнопки submit которых имеют имена, аналогичные именам функций, т.е. func1, func2 и т.д. Есть массив с именами этих функций.

Можно ли как-то с помощью проверки массива $_REQUEST запустить функцию с соответствующим именем? Т.е. если существует $_REQUEST['func1'], то запустить функцию func1(). Сейчас это все через if проверяется, но портянка слишком длинная уже. Да и нет гибкости.

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

Возможно ли это в принципе? Заранее большое спасибо за помощь.
2. caballero - 23 Сентября, 2011 - 01:57:10 - перейти к сообщению
$_REQUEST['func1']()
3. Schupp - 23 Сентября, 2011 - 02:11:49 - перейти к сообщению
caballero пишет:
$_REQUEST['func1']()


Не понял Однако Абсолютно... Может невнятно объяснил я?
Вместо:
if ($_REQUEST['func1']) func1();
if ($_REQUEST['func2']) func2();
.....
if ($_REQUEST['func9']) func9();
Хочется получить что-то более универсальное и короткое. Если возможно, конечно. А значения $_REQUEST['func1'] могут быть любыми, это ведь имена кнопок.
4. caballero - 23 Сентября, 2011 - 02:58:55 - перейти к сообщению
Я предположил что имена кнопок будут совпадать с именами функций - куда уж универсальнее
5. Schupp - 23 Сентября, 2011 - 03:13:38 - перейти к сообщению
caballero пишет:
имена кнопок будут совпадать с именами функций


Так ведь имена, а не значения... Значения могут быть в районе "Отправить", "Добавить", "Сохранить"...

Неее, не доходит до меня. Торможу, наверно Недовольство, огорчение Неужели в такой форме можно имя функции записать в php и она запустится? Т.е. к примеру $_GET['abc']() равнозначно abc()? Или если значение $_GET['abc'] равно def, то вышеуказанная запись равносильна def()? Где правда?
6. Ch_chov - 23 Сентября, 2011 - 05:14:27 - перейти к сообщению
Цитата:
Неужели в такой форме можно имя функции записать в php и она запустится?
А что мешает вам это проверить?
Если вашим скриптом будут пользоваться посторонние пользователи, то просто так вставлять $_GET['abc']() в свой код конечно не стоит. Это не безопасно.
7. DeepVarvar - 23 Сентября, 2011 - 07:17:00 - перейти к сообщению
Schupp пишет:
запустить функцию с соответствующим именем?

ЧПУ, method_exists и остальные плюшки ООП.
8. EuGen - 23 Сентября, 2011 - 09:44:34 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $rgFunctions=array('func1','func2','func3');//допустимые для вызова функции
  2. array_walk($_REQUEST, function($value, $key) use (&$rgFunctions)
  3. {
  4.    return in_array($key, $rgFunctions)?$key():null;
  5. });

PHP>=5.3
9. Schupp - 23 Сентября, 2011 - 12:37:03 - перейти к сообщению
Ch_chov пишет:
А что мешает вам это проверить?


Да ничто, конечно. Но ведь кроме решения есть еще и понимание. Потому и спрашиваю у специалистов, что хочу понять, КАК это работает, а не просто получить готовый рабочий код, который, не понимая смысла его работы, потом просто буду вставлять куда-то. Не дело это. PHP пока только изучаю, но изучаю на конкретных скриптах.

EuGen пишет:
PHP>=5.3

Огромное спасибо! Сижу, разбираюсь. Только один вопрос остался: что именно здесь в более ранних версиях php не будет работать? Просто на хостинге одном у меня стоит 5.3, а на другом - 5.2, но к тому, где более ранняя версия пока доступа не имею, не могу проверить, жду возвращения человека из отпуска. А пока он вернется - меня жаба задушит Улыбка)))
10. Мелкий - 23 Сентября, 2011 - 12:45:12 - перейти к сообщению
Schupp пишет:
Только один вопрос остался: что именно здесь в более ранних версиях php не будет работать?

Весь скрипт. С parse error. Объявление callback функции типа такого function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.
11. Schupp - 23 Сентября, 2011 - 12:55:37 - перейти к сообщению
Мелкий пишет:
function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.


Спасибо. Боюсь показаться навязчивым, но может есть подобное решение, но чтобы на версии 5.2 работало? Я не прошу готовый скрипт, мне смысл понять важно...
12. Мелкий - 23 Сентября, 2011 - 12:58:28 - перейти к сообщению
create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.
13. Schupp - 23 Сентября, 2011 - 13:16:10 - перейти к сообщению
Мелкий пишет:
create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.

Ага!!! Спасибо огромное всем, кто помогал! Вроде дошел смысл. Теперь буду нюансы сам уже пилить Улыбка
14. caballero - 23 Сентября, 2011 - 13:19:20 - перейти к сообщению
И сколько у вас там submit? Полсотни?



Я имел виду что если есть функция
save1();

то можно

$func = "save1";

$func() вызовет save1
то если есть способ прописать где то имя функции то можно не делать кучу if

но функции должны быть единообразны иначе смысла нет

а в этом случае гораздо проще сделать одну функцию и передаваь ей кнопку в виде одного из параметров
15. Schupp - 24 Сентября, 2011 - 01:08:26 - перейти к сообщению
caballero пишет:
И сколько у вас там submit? Полсотни?


Ну не полсотни, но пара десятков наберется.

caballero пишет:
Я имел виду что если есть функция
save1();

то можно

$func = "save1";

$func() вызовет save1

Улыбка Вот этим Вы меня и запутали. Посмотрите свой первый пост. Вы наверно невнимательно прочитали мой вопрос и потому сбили меня с толку ;) Предложенным Вами способом вызывается функция, имя которой совпадает со значением переменной, а никак не индексом массива. А я ясно написал, что именно индекс массива совпадает с именем функции. Это меня и тормозило.

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

Так что все еще раз огромное спасибо за толчок в нужном направлении.

 

Powered by ExBB FM 1.0 RC1