【问题标题】:PHP: E_RECOVERABLE_ERROR: Instantiation of 'Closure' is not allowed?PHP:E_RECOVERABLE_ERROR:不允许实例化“闭包”?
【发布时间】:2014-04-21 08:51:25
【问题描述】:

您好,很遗憾,我在 Google 上找不到有关此错误的更多信息,我想知道问题出在哪里。我有一个包含很多信息的数组,包括一些闭包(代码示例被缩短):

$create_info = array (
'foo' => 'bar',
'create_connection_object' => function ($my_key,$foreign_key) {
     return new ApConnection(intval($my_key), intval($foreign_key));
},
'hello' => 'world'
);

然后我有一个根据上下文使用这个数组的方法:

$create_connection_object = $create_info['create_connection_object'];
$con = new $create_connection_object(intval($request->first_id),intval($request->second_id));

执行此代码时出现以下错误:

"E_RECOVERABLE_ERROR: Instantiation of 'Closure' is not allowed"

在另一种情况下,我得到了一些看起来非常相似的东西(来自数组的闭包)并动态实例化。有人知道这可能失败的原因吗?

【问题讨论】:

  • 您的回调似乎已经创建了一个new 对象,即一个ApConnection。因此,您尝试再次newen,即使您的 $create_con_ 回调已经完成。
  • 哦,伙计... O:-P 谢谢,有时我在凌晨 4 点看不到愚蠢的简单错误。请随意回答。

标签: php closures


【解决方案1】:

4 点钟的项目通常是最有成效的。这实际上是关于这个特定错误消息的一个非常简洁的参考问题。

您的 $create_connection_object() 闭包被 PHP 误解了。

 = new $create_connection_object(..)

在解释器看来确实像= new Closure(),因为$create_con_ 已经是一个匿名函数。 (仅当您的变量包含文字类名字符串时才有效)。

new 是多余的,因为回调本身已经返回 new ApConnection。因此,只需使用 $con =new$create_con_() 调用它就足以返回您的闭包事先实例化的对象。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 2014-04-21
    • 2017-02-14
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多