php:为什么preg_replace_callback不允许内置php函数,只是匿名用户函数?

时间:2012-09-13 09:50:16

标签: php callback callable preg-replace-callback

这不起作用,并输出一个空字符串:

$check["pattern"] = "correct";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],ucfirst,$text);

使用内置函数本来不错。事实上,一般回调确实允许内置函数按http://php.net/manual/en/language.types.callable.php,但不允许preg_replace_callback。可能是php的功能请求吗?

2 个答案:

答案 0 :(得分:3)

您的代码应触发通知和警告:

  • 注意:使用未定义的常量ucfirst - 假设' ucfirst'
  • 警告:preg_replace_callback():分隔符不能是字母数字或反斜杠

如果没有,您真的需要检查PHP错误报告设置。在错误消息的帮助下修复代码:

$check["pattern"] = "/correct/";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],'ucfirst',$text);

......我们得到了这个:

  

警告:ucfirst()要求参数1为字符串,给定数组为

因此使用内置回调函数工作正常。但是,正如manual page for ucfirst()所解释的那样,函数需要string,而不是数组。而且,正如manual page for preg_replace_callback()所解释的那样:

  

将在主题字符串中调用并传递匹配元素的数组的回调。

总结一下:它不是一个明智的功能请求,它是您代码中的错误; - )

答案 1 :(得分:2)

它适用于所有功能。问题是这些功能需要某些参数。 ucfirst期望字符串作为输入,但preg_replace_callback传递匹配数组。

所以...如果你有一个内置函数,其签名与preg_replace回调签名兼容,它就可以了。但不,并非所有内置函数都具有兼容的签名。