Php 什么';s获取create_函数作为回调函数的语法:

Php 什么';s获取create_函数作为回调函数的语法:,php,callback,create-function,Php,Callback,Create Function,我尝试了以下代码: $for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];'); $result = preg_replace_callback( $regex, '$for_callback', $string); 变量$GLOBALS['replacements']在调用此函数之前动态生成 我收到一条错误消息,如 警告:preg\u replace\u callback()[

我尝试了以下代码:

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];');
$result = preg_replace_callback( $regex, '$for_callback', $string);
变量
$GLOBALS['replacements']
在调用此函数之前动态生成

我收到一条错误消息,如

警告:preg\u replace\u callback()[function.preg replace callback]:要求参数2“$for\u callback”是…(中的有效回调)

创建的函数和回调对我来说都是新的。这是从nickb给我的一些代码发展而来的,这些代码变成了
preg\u replace\u callback

我试图做的是将答案中的代码包装到一个函数中,我在避免重新定义函数时遇到了错误。(升级到PHP5.3+目前对我来说是一个远程可行的选择。)


如何实现这一点?

首先,变量不能用单引号括起来,因为它们不会被实际值替换

其次,您应该使用匿名函数(即闭包),因为它们更简单。如本例所示使用它们:

$for_callback = function($match) {
    return $GLOBALS['replacements'][$match[1]];
};
$result = preg_replace_callback( $regex, $for_callback, $string);
编辑:闭包在PHP5.3中变得可用。因此,如果您仍在使用PHP<5.3,您应该(真正更新或)使用以下内容:

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];');
$result = preg_replace_callback( $regex, $for_callback, $string);

“$match”
应该只是
$match
,或者如果您对cargo cult编程感兴趣,
“$match”
。其他引用的变量也是如此。我认为这看起来很奇怪,但这里有一个来自php.net的片段:$newfunc=create_函数('$a,$b','return“ln($a)+ln($b)=”“.log($a*$b););。看起来PHP评估了该代码。实际的错误不在我的
create\u function()
中,而是在我的
preg\u replace\u callback()
中,我在函数变量不属于的地方留下了单引号。我的PHP版本不支持闭包,但显然支持
create\u function()
只是在我的回答中反映了这一点。但是,你应该真的,真的更新你的PHP版本。有没有一个在森林中找不到你要找的树的时刻?我看错了你的答案,没有看到你纠正了我的
,“$for_callback”,
。这些引号是我尝试命名函数时留下的。