【问题标题】:Closure causes syntax error in php-5.2关闭导致 php-5.2 中的语法错误
【发布时间】:2011-06-25 05:22:09
【问题描述】:

我正在执行来自 post 的以下代码:

preg_match_all("/'(.+)' ((\w+)\(? ?(\d*) ?\)?)/", $sql, $_matches, PREG_SET_ORDER);
$matches = array_map(function($v) {return array(trim($v[2]), $v[1]);}, $_matches);

但我收到以下错误:

Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in SqlParser.php on line 29

我花了一些时间来解决这个问题,但我无法找到解决方案。

谁能告诉我这是怎么回事?

【问题讨论】:

标签: php closures php-5.2


【解决方案1】:

我假设您使用的 PHP 版本低于 5.3,它不支持闭包(您在 cmets 中确认了这一点)。下面的代码应该可以工作。我只是将匿名函数转换为普通函数。

function map_cb($v){
    return array(trim($v[2]), $v[1]);
}


preg_match_all("/'(.+)' ((\w+)\(? ?(\d*) ?\)?)/", $sql, $_matches, PREG_SET_ORDER);
$matches = array_map("map_cb", $_matches);

【讨论】:

  • 我使用的是 PHP 版本 5.2.10-2ubuntu6.10
  • 它试过了,它给了我以下错误:Warning: array_map() [function.array-map]: The first argument, 'map_cb', should be either NULL or a valid callback
  • 你确定你把包括map_cb函数在内的所有代码都剪切粘贴了?
  • 是的,我在class 中对其进行编码,所以我只是将public 放在map_cb function 之前。
  • 那么你必须使用 array($this,"map_cb") 而不是 "map_cb"
【解决方案2】:

除非您使用的是 php 5.3,否则您不能使用这样的匿名函数。根据the php documentation for callbacks

从 PHP 5.3.0 开始,还可以 将闭包传递给回调 参数。

您可以改用create_function() 来创建匿名。函数,这将在 PHP 5.3 之前运行。或者使用 GWW 的答案,应该也可以。

否则,如果您有兴趣了解有关 anon 的更多信息。 PHP 5.3+ 中的函数,你可以阅读their php docs

【讨论】:

  • 我使用的是 PHP 版本 5.2.10-2ubuntu6.10
  • @Awan 那就是你的问题。我认为您可以改用create_function() 之类的东西。或者使用@GWW 建议,应该也可以。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2020-11-12
  • 2014-09-04
相关资源
最近更新 更多