вызов функции php из строки (с параметрами) - PullRequest
5 голосов
/ 04 июня 2011

Я хотел бы запустить php-функцию динамически, используя эту строку:

do_lightbox('image1.jpg', 'picture 1')

Я проанализировал строку следующим образом:

$exe = "do_lightbox";
$pars = "'image1.jpg', 'picture 1'";

и попытался использовать следующий код:

$rc = call_user_func($exe, $pars);

к сожалению, это дает мне ошибку - я также попытался разбить $ pars, как

$pars = explode(',', $pars);

, но не помогло..

есть идеи?спасибо

Ответы [ 6 ]

5 голосов
/ 04 июня 2011

Я думаю, это то, что вы ищете:

$exe = "do_lightbox";
$pars = array('image1.jpg', 'picture 1');

$rc = call_user_func_array($exe, $pars);
2 голосов
/ 04 июня 2011

Это пример того, как работает call_user_func():

function myfunc($p1,$p2){
    echo "first: $p1, second: $p2\n";
}

$a1="someval";
$a2="someotherval";
call_user_func("myfunc",$a1,$a2);

Отличие здесь от предыдущих примеров в том, что вам не нужно передавать каждый аргумент в одном массиве.Кроме того, вы можете проанализировать массив строк с разделителями и сделать то же самое:

function myfunc($p1,$p2){
    echo "first: $p1, second: $p2\n";
}

$a="someval, someotherval";
$e=explode(", ",$a);
$a1=$e[0];
$a2=$e[1];
call_user_func("myfunc",$a1,$a2);
2 голосов
/ 04 июня 2011

$ pars должен быть массивом с параметрами в нем.Должно быть: array('image1.jpg', 'picture 1'), но с вашим методом это: array("'image1.jpg'", " 'picture 1'"), что не то, что вы ищете.

1 голос
/ 04 июня 2011

Хотя мне интересно, зачем вам такая функциональность (проблемы с безопасностью), вот решение:

$exe = "do_lightbox";
$pars = "'image1.jpg', 'picture 1'";
call_user_func_array($exe, explode(',', $pars));

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

1 голос
/ 04 июня 2011

Все, хотя это настоятельно не рекомендуется, вы можете использовать функцию eval :

eval("do_lightbox('image1.jpg', 'picture 1')")
1 голос
/ 04 июня 2011

Лучше всего использовать call_user_func_array, что позволяет передавать аргументы в виде массива:

call_user_func_array($exe, $pars);

В качестве альтернативы вы можете использовать eval для непосредственного анализа строки (но я не рекомендую это):

eval("do_lightbox('image1.jpg', 'picture 1')");

Который будет выполнять вашу функцию.

...