我最近才开始摆弄匿名函数,我决定尝试在一个更大的项目中实际使用它。遇到障碍后,我试着设置一个小的练习脚本,但同样的问题仍然存在。我不太明白这是怎么回事,但这里有一些代码,
$a = function($in) {
echo $in;
};
$a('b4ng');
上面的工作很好,下面的也一样,
class Foo {
public $cmd;
public function __construct() {
$this->cmd = new stdClass();
$this->cmd->a = 'b4ng';
}
}
$bar = new Foo();
echo $bar->cmd->a;
下面的不能工作,
class Foo {
public $cmd;
public function __construct() {
$this->cmd = new stdClass();
$this->cmd->message = function($in) {
echo $in;
};
}
}
$bar = new Foo();
$bar->cmd->message('b4ng');
当尝试使用上面的代码片段时,我遇到了以下错误,
Fatal error: Call to undefined method stdClass::message()
我明白错误告诉我什么,我只是不明白为什么;'message'显然不是stdClass的原生函数/方法,但它是在'cmd'中声明的。
还有一件事你不能做:
$o = new SomeClass();
$m = $o->someMethod;
$m();
这里的问题是PHP对成员函数调用有一个特殊的语法,它匹配$o->foo()
。但在您的情况下,foo
是一个闭包(即数据成员,而不是方法),因此会导致错误。为了解决这个问题,你首先需要从你的对象中检索foo
,然后调用它:
// use brackets to force evaluation order
($o->foo)(args..);
// use dedicated function
call_user_func($o->foo, args..);
// use two steps
$foo = $o->foo;
$foo(args..);
我会先尝试第一个变体,但我不确定PHP是否允许它。最后一个变体是最模糊的,但它肯定是有效的。
在PHP中,你不能在类本身之外定义类方法。所以,你不能创建stdClass的实例,然后动态地为它创建方法。