$this在回调函数中的含义是什么?

3
我想知道为什么这个可以工作:
class Foo {
    public function doSomethingFunny($subject) {
        preg_replace_callback(
            "#pattern#",
            array($this, 'doX'),
            $subject
        );
    }
    private function doX() {
        echo 'why does this work?';
    }
}

为什么回调函数还在$this的上下文中?我希望它只能允许公共方法。我在回调函数的工作原理方面缺乏一些基本的知识。
3个回答

5

preg_replace_callback()函数中的回调参数可以调用一个方法,并允许传递一个数组来告诉该方法回调的上下文。这不仅限于$this,还可以是任何对象变量。

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

在上面的例子中,如果Foo::bar()是私有的,那么这将不起作用。然而,在您的原始情况下,由于使用了与私有方法处于同一上下文中的$this,因此仍会触发私有方法。

3

如果它在同一个类中,那么它就在同一个作用域/上下文中($this)。


我要冒险说“是的”(我没有确凿的事实支持这个说法)。但回调的目的是在事件后对当前上下文执行某些操作,因此逻辑推断上下文将在上下文中存在。 - jonezy

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'));
    }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接