首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP7.2-在字符串中拥有函数体时如何动态创建匿名函数

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

Stack Overflow用户
提问于 2018-09-30 15:03:42
回答 5查看 1.7K关注 0票数 12

如何在字符串中包含函数体时动态创建匿名函数。

例如:

代码语言:javascript
复制
$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()中,我们可以将函数体作为字符串传递,我想从字符串变量中定义匿名函数的主体。

EN

回答 5

Stack Overflow用户

发布于 2018-10-11 04:51:16

您可以使用可调用类型提示。下面是一个例子

代码语言:javascript
复制
function callThatAnonFunction(callable $callback) {
    return $callback();
}

它可以使用任何arg params的匿名函数:

代码语言:javascript
复制
$user = "person";
$location = "world";
callThatAnonFunction(function() use ($user, $location) {
    echo "Hello " . $user . " in " . $location;
});
票数 2
EN

Stack Overflow用户

发布于 2018-10-11 05:08:32

你可以试试这个:

代码语言:javascript
复制
$user = "John Doe";
$body = "echo 'Hello' . $user;";

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

echo $myFunct($user);
票数 2
EN

Stack Overflow用户

发布于 2018-10-11 20:17:39

这很难看,你不应该这么做,但你在一条评论中说,你这样做是为了一个代码混淆器,下面是我的2美分:

代码语言:javascript
复制
$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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52579112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档