我想知道为什么会这样:
class Foo {
public function doSomethingFunny($subject) {
preg_replace_callback(
"#pattern#",
array($this, 'doX'),
$subject
);
}
private function doX() {
echo 'why does this work?';
}
}
为什么回调仍然在$ this的上下文中?我希望它只允许公共方法。我错过了回调如何工作的基本信息。
答案 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'));
}
}
虽然没有明确记录,但这将非常方便。