奇怪的对象/类问题(stdClass)

时间:2014-07-19 03:53:41

标签: php

我刚刚开始讨论匿名函数,我决定尝试将它用于更大的项目中。在遇到路障后,我尝试设置一个小练习脚本,但同样的问题仍然存在。我不太明白发生了什么,但这里有一些代码,

$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'中声明的。

2 个答案:

答案 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的实例,然后为其动态创建方法。

相关问题