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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Имя функции из переменной
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Прошу помощи, ибо в полном ступоре сейчас...
Такая ситуация. Есть некоторое количество функций. Пусть названия будут func1, func2 и т.д. Есть формы на различных страницах, кнопки submit которых имеют имена, аналогичные именам функций, т.е. func1, func2 и т.д. Есть массив с именами этих функций.
Можно ли как-то с помощью проверки массива $_REQUEST запустить функцию с соответствующим именем? Т.е. если существует $_REQUEST['func1'], то запустить функцию func1(). Сейчас это все через if проверяется, но портянка слишком длинная уже. Да и нет гибкости.
Быть может, несколько сумбурно написал, но просто задолбало уже при мельчайшем изменении лезть в код в куче мест. Цель - при добавлении новой функции просто прописать ее имя в массив и не геморроится потом с поиском остальных мест, куда что-то прописывать надо...
Возможно ли это в принципе? Заранее большое спасибо за помощь.
caballero
Отправлено: 23 Сентября, 2011 - 01:57:10
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
caballero пишет:
$_REQUEST['func1']()
Не понял Абсолютно... Может невнятно объяснил я?
Вместо:
if ($_REQUEST['func1']) func1();
if ($_REQUEST['func2']) func2();
.....
if ($_REQUEST['func9']) func9();
Хочется получить что-то более универсальное и короткое. Если возможно, конечно. А значения $_REQUEST['func1'] могут быть любыми, это ведь имена кнопок.
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
caballero пишет:
имена кнопок будут совпадать с именами функций
Так ведь имена, а не значения... Значения могут быть в районе "Отправить", "Добавить", "Сохранить"...
Неее, не доходит до меня. Торможу, наверно Неужели в такой форме можно имя функции записать в php и она запустится? Т.е. к примеру $_GET['abc']() равнозначно abc()? Или если значение $_GET['abc'] равно def, то вышеуказанная запись равносильна def()? Где правда?
Ch_chov
Отправлено: 23 Сентября, 2011 - 05:14:27
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Цитата:
Неужели в такой форме можно имя функции записать в php и она запустится?
А что мешает вам это проверить?
Если вашим скриптом будут пользоваться посторонние пользователи, то просто так вставлять $_GET['abc']() в свой код конечно не стоит. Это не безопасно.
DeepVarvar
Отправлено: 23 Сентября, 2011 - 07:17:00
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Schupp
Отправлено: 23 Сентября, 2011 - 12:37:03
Новичок
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Ch_chov пишет:
А что мешает вам это проверить?
Да ничто, конечно. Но ведь кроме решения есть еще и понимание. Потому и спрашиваю у специалистов, что хочу понять, КАК это работает, а не просто получить готовый рабочий код, который, не понимая смысла его работы, потом просто буду вставлять куда-то. Не дело это. PHP пока только изучаю, но изучаю на конкретных скриптах.
EuGen пишет:
PHP>=5.3
Огромное спасибо! Сижу, разбираюсь. Только один вопрос остался: что именно здесь в более ранних версиях php не будет работать? Просто на хостинге одном у меня стоит 5.3, а на другом - 5.2, но к тому, где более ранняя версия пока доступа не имею, не могу проверить, жду возвращения человека из отпуска. А пока он вернется - меня жаба задушит )))
Мелкий
Отправлено: 23 Сентября, 2011 - 12:45:12
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Schupp пишет:
Только один вопрос остался: что именно здесь в более ранних версиях php не будет работать?
Весь скрипт. С parse error. Объявление callback функции типа такого function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.
----- PostgreSQL DBA
Schupp
Отправлено: 23 Сентября, 2011 - 12:55:37
Новичок
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Мелкий пишет:
function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.
Спасибо. Боюсь показаться навязчивым, но может есть подобное решение, но чтобы на версии 5.2 работало? Я не прошу готовый скрипт, мне смысл понять важно...
Мелкий
Отправлено: 23 Сентября, 2011 - 12:58:28
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.
----- PostgreSQL DBA
Schupp
Отправлено: 23 Сентября, 2011 - 13:16:10
Новичок
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Мелкий пишет:
create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.
Ага!!! Спасибо огромное всем, кто помогал! Вроде дошел смысл. Теперь буду нюансы сам уже пилить
caballero
Отправлено: 23 Сентября, 2011 - 13:19:20
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
И сколько у вас там submit? Полсотни?
Я имел виду что если есть функция
save1();
то можно
$func = "save1";
$func() вызовет save1
то если есть способ прописать где то имя функции то можно не делать кучу if
но функции должны быть единообразны иначе смысла нет
а в этом случае гораздо проще сделать одну функцию и передаваь ей кнопку в виде одного из параметров
Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
caballero пишет:
И сколько у вас там submit? Полсотни?
Ну не полсотни, но пара десятков наберется.
caballero пишет:
Я имел виду что если есть функция
save1();
то можно
$func = "save1";
$func() вызовет save1
Вот этим Вы меня и запутали. Посмотрите свой первый пост. Вы наверно невнимательно прочитали мой вопрос и потому сбили меня с толку ;) Предложенным Вами способом вызывается функция, имя которой совпадает со значением переменной, а никак не индексом массива. А я ясно написал, что именно индекс массива совпадает с именем функции. Это меня и тормозило.
Но на основании вышеприведенных постов оказалось, что у этого вопроса есть куча красивых решений И с помощью вызова функции, и с проходом массива по foreach, да и просто с key() тоже решаемо.
Так что все еще раз огромное спасибо за толчок в нужном направлении.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.