Расширение fardjad ответа «s, я рекомендовал бы этот подход:
// you only need this part once
$DeclarationSyntax = '
function %s() {
$name = __FUNCTION__;
$func = $GLOBALS["Lambda"][$name];
call_user_func_array($func,func_get_args());
}
';
// define your stuff as lambda functions
$Lambda["hello"] =
function($what) {
print "Hello $what, as Ritchie said<br>";
}
;
$Lambda["goodbye"] =
function($what,$when) {
print "Goodbye cruel $what, I'm leaving you $when<br>";
}
;
// copy them as normal functions
foreach(array_keys($Lambda) as $name) {
$name = preg_replace('/[^a-zA-Z0-9_]/',"",$name); // just for safety
eval(sprintf($DeclarationSyntax,$name)); // where the magic happens
}
// and now you can use them:
hello('world');
goodbye('world','today');
Это имеет много преимуществ; во-первых, он работает со многими функциями, не повторяя себя. Что еще более важно, ошибки компилятора будут отображаться так, как вы ожидали, с номерами строк и всего, а не просто «что-то не так внутри eval». Кроме того, вам не нужно беспокоиться о котировках, благодаря функциям лямбда.
Имейте в виду, что вы используете глобальные переменные здесь; eval должен вызываться из глобальной области для создания функций так, как вам нужно.