在从关联数组转换的对象中调用匿名函数

Calling anonymous function in object converted from associative array

根据Jason's suggestion关于快速和肮脏的单行对象,我尝试创建方法:

$obj = (object)array(
  "handler" => function() { return "Doom"; }
);

以直观的方式调用它失败:

echo $obj->handler();
//Fatal error: Call to undefined method stdClass::handler()

但这种方式有效:

$fnptr = $obj->handler;
echo $fnptr();
// "Doom"

虽然从关联数组(不是对象)调用它 运行s 没有致命错误:

$arr = array(
  "handler" => function() { return "Doom"; }
);
echo $arr["handler"]();
// "Doom"

你能解释一下幕后发生的事情吗? (我 运行 在 PHP 5.5.8)

PHP 在这里试图做什么:

echo $obj->handler();

只是想调用一个普通的方法。但是这个方法没有定义,所以你得到:

Fatal error: Call to undefined method stdClass::handler()

但是当你这样做时:

$fnptr = $obj->handler;
echo $fnptr();

您将匿名函数属性 handler 的值赋给变量$fnptr。然后 PHP 不会尝试调用方法,它只是调用你的匿名函数并且它起作用了。

当你有一个包含匿名函数的数组元素时也是如此。 PHP 不尝试调用方法,它只是调用匿名函数。


所以你无法让它像这样工作:

echo $obj->handler();

对于一个对象,因为它总是会尝试调用一个方法。