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

时间:2015-11-30 03:02:00

标签: php object php-5.5

根据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"

虽然从关联数组(非对象)调用它但没有致命错误:

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

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

1 个答案:

答案 0 :(得分:1)

PHP在这里尝试做什么:

echo $obj->handler();

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

  

致命错误:调用未定义的方法stdClass :: handler()

但是当你这样做时:

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

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

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


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

echo $obj->handler();

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