如何在字符串中包含函数体时动态创建匿名函数。
例如:
$user = "John Doe";
$body = "echo 'Hello' . $user;";
$myFunct = function($user) {$body}; // How do I have function body here from string.
$myFunct($user);任何帮助都将不胜感激。
我正在寻找create_function()功能的替代品,这是PHP早期版本中的功能。就像在create_function()中,我们可以将函数体作为字符串传递,我想从字符串变量中定义匿名函数的主体。
发布于 2018-10-11 04:51:16
您可以使用可调用类型提示。下面是一个例子
function callThatAnonFunction(callable $callback) {
return $callback();
}它可以使用任何arg params的匿名函数:
$user = "person";
$location = "world";
callThatAnonFunction(function() use ($user, $location) {
echo "Hello " . $user . " in " . $location;
});发布于 2018-10-11 05:08:32
你可以试试这个:
$user = "John Doe";
$body = "echo 'Hello' . $user;";
$myFunct = function($user) {
return $body;
};
echo $myFunct($user);发布于 2018-10-11 20:17:39
这很难看,你不应该这么做,但你在一条评论中说,你这样做是为了一个代码混淆器,下面是我的2美分:
$args = '$user, $number';
$body = 'echo "#$number: Hello $user.\n";';
function _create_function_without_eval($args, $body) {
$func_name = sprintf('temp_func_%s', md5($body));
$code = sprintf("<?php if (!function_exists('%s')) {function %s(%s){%s}}", $func_name, $func_name, $args, $body);
$func_file = tempnam('/tmp', $func_name);
$handle = fopen($func_file, "w+");
fwrite($handle, $code);
fclose($handle);
include $func_file;
unlink($func_file);
return function(...$user_args) use ($func_name) {
return call_user_func_array($func_name, $user_args);
};
}
function _create_function_with_eval($args, $body) {
$func_name = sprintf('temp_func_%s', md5($body));
$code = sprintf("if (!function_exists('%s')) {function %s(%s){%s}}", $func_name, $func_name, $args, $body);
eval($code);
return function(...$user_args) use ($func_name) {
return call_user_func_array($func_name, $user_args);
};
}
$fn_deprecated = create_function($args, $body);
$fn_with_eval = _create_function_with_eval($args, $body);
$fn_without_eval = _create_function_without_eval($args, $body);
echo $fn_deprecated('Old Bob', '1');
echo $fn_without_eval('Bob without eval', 2);
echo $fn_with_eval('Bob with eval', 3);看看这里的直播:https://3v4l.org/urQ4k
https://stackoverflow.com/questions/52579112
复制相似问题