奇怪对象/类问题(stdClass)


Strange Object/Class Issue (stdClass)

我最近才开始摆弄匿名函数,我决定尝试在一个更大的项目中实际使用它。遇到障碍后,我试着设置一个小的练习脚本,但同样的问题仍然存在。我不太明白这是怎么回事,但这里有一些代码,

$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的实例,然后动态地为它创建方法。