我刚刚开始讨论匿名函数,我决定尝试将它用于更大的项目中。在遇到路障后,我尝试设置一个小练习脚本,但同样的问题仍然存在。我不太明白发生了什么,但这里有一些代码,
$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'中声明的。
答案 0 :(得分:1)
还有一件事你不能做:
$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是否允许它。最后一个变种是最狡猾的,但肯定有效。
答案 1 :(得分:0)
在PHP中,您无法在类本身之外定义类方法。因此,您无法创建stdClass的实例,然后为其动态创建方法。