在从关联数组转换的对象中调用匿名函数
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();
对于一个对象,因为它总是会尝试调用一个方法。
根据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();
对于一个对象,因为它总是会尝试调用一个方法。