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

Php 在从关联数组转换的对象中调用匿名函数,php,object,php-5.5,Php,Object,Php 5.5,根据关于快速和肮脏的单线对象,我尝试创建方法: $obj = (object)array( "handler" => function() { return "Doom"; } ); 将其称为直观的方式是失败的: echo $obj->handler(); //Fatal error: Call to undefined method stdClass::handler() 但这种方法是有效的: $fnptr = $obj->handler; echo $fnptr()

根据关于快速和肮脏的单线对象,我尝试创建方法:

$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上运行)

PHP在这里试图做什么:

echo $obj->handler();
只是尝试调用一个普通的方法。但此方法未定义,因此您可以得到:

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

但当你这样做的时候:

$fnptr = $obj->handler;
echo $fnptr();
将属性
处理程序
的值(这是一个匿名函数)分配给变量
$fnptr
。然后PHP不会尝试调用一个方法,它只会调用你的匿名函数,它就可以工作了

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


所以你不可能让它像这样工作:

echo $obj->handler();

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

请看一看:是否有任何语法糖分可以直接调用处理程序?类似于
echo{$obj->handler}()
?@JanTuroň不,没有办法将它分配给tmp变量。@JanTuroň我能想到的唯一一件事是使用神奇的方法
\u call()
,例如
调用用户函数($obj->handler)
会起作用,尽管这不会更好。