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 :: Имя функции из переменной

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Schupp
Отправлено: 23 Сентября, 2011 - 01:27:23
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Прошу помощи, ибо в полном ступоре сейчас...

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

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

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

Возможно ли это в принципе? Заранее большое спасибо за помощь.
 
 Top
caballero
Отправлено: 23 Сентября, 2011 - 01:57:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




$_REQUEST['func1']()


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Schupp
Отправлено: 23 Сентября, 2011 - 02:11:49
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




caballero пишет:
$_REQUEST['func1']()


Не понял Однако Абсолютно... Может невнятно объяснил я?
Вместо:
if ($_REQUEST['func1']) func1();
if ($_REQUEST['func2']) func2();
.....
if ($_REQUEST['func9']) func9();
Хочется получить что-то более универсальное и короткое. Если возможно, конечно. А значения $_REQUEST['func1'] могут быть любыми, это ведь имена кнопок.

(Отредактировано автором: 23 Сентября, 2011 - 02:12:33)

 
 Top
caballero
Отправлено: 23 Сентября, 2011 - 02:58:55
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Я предположил что имена кнопок будут совпадать с именами функций - куда уж универсальнее


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Schupp
Отправлено: 23 Сентября, 2011 - 03:13:38
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




caballero пишет:
имена кнопок будут совпадать с именами функций


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

Неее, не доходит до меня. Торможу, наверно Недовольство, огорчение Неужели в такой форме можно имя функции записать в php и она запустится? Т.е. к примеру $_GET['abc']() равнозначно abc()? Или если значение $_GET['abc'] равно def, то вышеуказанная запись равносильна def()? Где правда?
 
 Top
Ch_chov
Отправлено: 23 Сентября, 2011 - 05:14:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
Неужели в такой форме можно имя функции записать в php и она запустится?
А что мешает вам это проверить?
Если вашим скриптом будут пользоваться посторонние пользователи, то просто так вставлять $_GET['abc']() в свой код конечно не стоит. Это не безопасно.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Сентября, 2011 - 07:17:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Schupp пишет:
запустить функцию с соответствующим именем?

ЧПУ, method_exists и остальные плюшки ООП.
 
 Top
EuGen Администратор
Отправлено: 23 Сентября, 2011 - 09:44:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Schupp
Отправлено: 23 Сентября, 2011 - 12:37:03
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Ch_chov пишет:
А что мешает вам это проверить?


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

EuGen пишет:
PHP>=5.3

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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Schupp пишет:
Только один вопрос остался: что именно здесь в более ранних версиях php не будет работать?

Весь скрипт. С parse error. Объявление callback функции типа такого function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.


-----
PostgreSQL DBA
 
 Top
Schupp
Отправлено: 23 Сентября, 2011 - 12:55:37
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Мелкий пишет:
function($value, $key) use - появилось только в PHP5.3. А более ранние версии посчитают это бредом.


Спасибо. Боюсь показаться навязчивым, но может есть подобное решение, но чтобы на версии 5.2 работало? Я не прошу готовый скрипт, мне смысл понять важно...
 
 Top
Мелкий Супермодератор
Отправлено: 23 Сентября, 2011 - 12:58:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.


-----
PostgreSQL DBA
 
 Top
Schupp
Отправлено: 23 Сентября, 2011 - 13:16:10
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Мелкий пишет:
create_function.
Можно и вовсе объявить функцию, как обычную пользовательскую, и передать array_walk только имя функции.

Ага!!! Спасибо огромное всем, кто помогал! Вроде дошел смысл. Теперь буду нюансы сам уже пилить Улыбка
 
 Top
caballero
Отправлено: 23 Сентября, 2011 - 13:19:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




И сколько у вас там submit? Полсотни?



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

то можно

$func = "save1";

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

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

а в этом случае гораздо проще сделать одну функцию и передаваь ей кнопку в виде одного из параметров


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Schupp
Отправлено: 24 Сентября, 2011 - 01:08:26
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




caballero пишет:
И сколько у вас там submit? Полсотни?


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

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

то можно

$func = "save1";

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

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

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

Так что все еще раз огромное спасибо за толчок в нужном направлении.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« HTTP и PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB