【问题标题】:Php closure function as parameter to preg_replace_callback results in Internal Server Error 500php 闭包函数作为 preg_replace_callback 的参数导致内部服务器错误 500
【发布时间】:2012-02-17 04:57:15
【问题描述】:

我有一个preg_replace_callback,它将闭包(匿名)函数作为第二个参数,它在本地工作得非常好,但是当我将它部署到实时环境时,它会导致错误 => 内部服务器错误 500。当我删除闭包它的工作原理。

$regExPattern = '/\<%(?<content>.*?)%\>/';
$template = preg_replace_callback($regExPattern, function ($matches)  use ($dataItem) {
    if(isset($dataItem[trim($matches['content'])])) {
        return $dataItem[trim($matches['content'])];
    }
    else {
        return '';
    }
}, $template);

任何建议我如何解决这个问题。我需要在回调函数中使用 $dataItem 并将其传递给preg_replace_callback。 我的开发环境是代码点火器。

【问题讨论】:

  • 您的生产服务器没有输出错误,这是一个很好的设计。你能检查错误日志并告诉我们实际的错误是什么吗?
  • 你的开发环境中是否有没有 php 5.3 的机会?
  • 就像@boobiq 我猜你的服务器很可能没有使用 PHP 5.3
  • 是的,你是对的,PHP 版本 5.2.17。你能帮我将一个函数传递给 preg_replace_callback 并在其中包含 $dataItem 吗?

标签: php callback preg-replace closures internal-server-error


【解决方案1】:

匿名函数仅适用于 PHP 5.3 及更高版本。你可以改用create_function()

$regExPattern = '/\<%(?<content>.*?)%\>/';
$template = preg_replace_callback($regExPattern, create_function(
      '$matches'
    , 'if(isset($dataItem[trim($matches[\'content\'])])) {
          return $dataItem[trim($matches[\'content\'])];
      }
      else {
          return "";
      }'
    )
);

当然,未经测试。

【讨论】:

  • 谢谢。但我不喜欢将代码写成字符串。所以我传递了像数组($this,'functionName')这样的函数并在类的主体中声明它:私有函数functionName。谢谢你:)
  • 是的,那将是另一种选择。我不确定它是否适用于私有函数,但我想你已经测试过了。
猜你喜欢
  • 1970-01-01
  • 2014-04-10
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-08-11
相关资源
最近更新 更多