PHP7.2-在字符串中包含函数体时如何动态创建匿名函数

PHP7.2-在字符串中包含函数体时如何动态创建匿名函数,php,anonymous-function,php-7.2,Php,Anonymous Function,Php 7.2,在字符串中有函数体时,如何动态创建匿名函数 例如 $user = "John Doe"; $body = "echo 'Hello' . $user;"; $myFunct = function($user) {$body}; // How do I have function body here from string. $myFunct($user); 任何帮助都将不胜感激 附言。 我正在寻找早期版本PHP中的create_function()功能的替代品。就像在create_func

在字符串中有函数体时,如何动态创建匿名函数

例如

$user = "John Doe";
$body = "echo 'Hello' . $user;";

$myFunct = function($user) {$body}; // How do I have function body here from string.

$myFunct($user);
任何帮助都将不胜感激

附言。
我正在寻找早期版本PHP中的create_function()功能的替代品。就像在create_function()中,我们可以将函数体作为字符串传递一样,我想在字符串变量中定义匿名函数体

如果您已经研究了所有其他选项,并且完全确定实现目标的唯一方法是在运行时使用字符串中的代码定义自定义函数,那么除了使用
create_函数
,您还有两种选择

快速解决方法是只使用
eval

function create_custom_function($arguments, $body) {
    return eval("return function($arguments) { $body };");
}

$myFunct = create_custom_function('$user', 'echo "Hello " . $user;');

$myFunct('John Doe');
// Hello John Doe
但是,可以禁用
eval()
。如果您甚至在
eval
不可用的服务器上也需要这种功能,您可以使用穷人的eval:将函数写入临时文件,然后将其包括在内:

function create_custom_function($arguments, $body) {
    $tmp_file = tempnam(sys_get_temp_dir(), "ccf");
    file_put_contents($tmp_file, "<?php return function($arguments) { $body };");
    $function = include($tmp_file);
    unlink($tmp_file);

    return $function;
}

$myFunct = create_custom_function('$user', 'echo "Hello " . $user;');

$myFunct('John Doe');
// Hello John Doe
函数创建自定义函数($arguments,$body){
$tmp_file=tempnam(sys_get_temp_dir(),“ccf”);

file\u put\u contents($tmp\u file,您可以使用可调用类型提示

function callThatAnonFunction(callable $callback) {
    return $callback();
}
它可以接受具有任意参数的匿名函数:

$user = "person";
$location = "world";
callThatAnonFunction(function() use ($user, $location) {
    echo "Hello " . $user . " in " . $location;
});
您可以尝试以下方法:

$user = "John Doe";
$body = "echo 'Hello' . $user;";

$myFunct = function($user) {
    return $body;
}; 

echo $myFunct($user);

这很难看,你不应该这样做,但你在评论中说你这样做是为了代码混淆器,所以这是我的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);
$args='$user,$number';
$body='echo“#$number:Hello$user.\n”;
函数_创建_函数_不带_eval($args,$body){
$func_name=sprintf('temp_func_%s',md5($body));

$code=sprintf(“PHP开发人员爱你哈哈哈,看看这里

$user = "John Doe";
$body = 'echo "Hello " . $a;';
$f = create_function('$a', $body);

$f($user);

//out : Hello John Doe
PHP官方文件:

注意事项

eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已仔细验证除了使用此构造之外没有其他选择,请特别注意,在未事先正确验证的情况下,不要将任何用户提供的数据传递到该构造中

因此Eval是最差的替代品,create_函数因使用Eval而被弃用

为adiinviter pro使用匿名函数

$b  = function () use ($d,$f1,$c,$ps){
            return gzinflate( base64_decode(str_rot13($ps) ) );
        };

使用evil eval。但如果您认为有必要这样做,那就有问题了。我正在编写一个自定义代码模糊器,需要它。在以前的PHP版本中,这在create_function()中非常简单。我正在PHP7.2中寻找create_function()的替代品我们以前将函数体作为字符串传递的功能。这是不安全的,它已被删除。请阅读“代码在执行之前已消除模糊,类似于ionCube加载程序和Zend Guard加载程序的工作方式”-这与这些扩展的工作方式甚至不太接近:)ionCube和Zend保护的工作原理是将PHP编译成字节码,保护字节码,并在各自的加载程序中使用引擎执行编译后的代码。对于ionCube,代码也可以使用从不存储的密钥进行加密,要求受保护的PHP应用程序本身根据需要生成解密密钥,以便能够解密pt并运行应用程序的进一步层。编码文件中没有PHP源代码:)@Nick Wow,感谢您的评论!您几年前的评论是对ionCube的一个有趣的观察。我得到更正:)因为问题是关于不在PHP7.2中使用
create\u函数