调用闭包时的奇怪行为

时间:2015-10-28 15:57:21

标签: php closures

我想知道为什么这不起作用:(PHP Fatal error: Call to undefined method stdClass::y()

$x=new stdClass;
$x->y=function(){return 'hi';};
echo $x->y();

但这有效:

$x=new stdClass;
$x->y=function(){return 'hi';};
$y=$x->y;
echo $y();

echo ($x->y)();也会使Parse error: syntax error, unexpected '(', expecting ',' or ';'无效。那么,在没有中间变量的情况下调用y闭包属性的正确方法是什么。

1 个答案:

答案 0 :(得分:4)

因为在PHP中,类可以具有函数和属性,而函数和属性可以具有相同的名称。

所以当你打电话时:

$x->y();

PHP将在$x上查找名为y的函数,然后调用它。你所拥有的是一个属性(持有一个函数/闭包)。

这与javascript不同,其中函数和属性都在同一个命名空间中。