$ this在回调函数中

时间:2011-02-24 19:46:39

标签: php object callback

我想知道为什么会这样:

class Foo {
    public function doSomethingFunny($subject) {
        preg_replace_callback(
            "#pattern#",
            array($this, 'doX'),
            $subject
        );
    }
    private function doX() {
        echo 'why does this work?';
    }
}

为什么回调仍然在$ this的上下文中?我希望它只允许公共方法。我错过了回调如何工作的基本信息。

3 个答案:

答案 0 :(得分:5)

preg_replace_callback()中的回调参数允许调用方法,并允许传递数组以告诉方法回调的上下文。它不仅是$ this,还有任何对象变量。

$foo = new Foo();
preg_replace_callback(
    "#pattern#",
    array($foo, 'bar'),
    $subject
);

在上面的例子中,如果Foo :: bar()是私有的,那就不行了。但是,在您的原始情况下,仍然会触发私有方法,因为使用了与私有方法相同的$ this。

答案 1 :(得分:3)

如果它在同一个类中,它在相同的范围/上下文中($ this)。

答案 2 :(得分:1)

我认为隐含在当前范围内执行回调。 call_user_func或任何使用回调的函数(例如preg_replace_callback)旨在以编程方式模拟等效的内联调用。换句话说,必须以这种方式运行才能提供预期的功能。

因此,在以下情况下,Foo->A()Foo->B()的行为应该相同,无论可见性如何:

class Foo() {
    function Bar() {
    }

    function A() {
         return $this->Bar();
    }
    function B() {
         return call_user_func(array($this, 'Bar'));
    }
}

虽然没有明确记录,但这将非常方便。