根据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上运行)
答案 0 :(得分:1)
PHP在这里尝试做什么:
echo $obj->handler();
只是试图调用普通方法。但是这个方法没有定义,所以你得到:
致命错误:调用未定义的方法stdClass :: handler()
但是当你这样做时:
$fnptr = $obj->handler;
echo $fnptr();
将属性handler
的值(匿名函数)赋值给变量$fnptr
。然后PHP不会尝试调用方法,它只是调用你的匿名函数并且它可以工作。
当你有一个包含匿名函数的数组元素时也一样。 PHP不会尝试调用方法,只是调用匿名函数。
所以你无法让它像这样工作:
echo $obj->handler();
对于一个对象,因为它总是会尝试调用一个方法。