$ this в функции обратного вызова - PullRequest
3 голосов
/ 24 февраля 2011

Я хотел бы знать, почему это работает:

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 голосов
/ 24 февраля 2011

Параметр обратного вызова в preg_replace_callback () позволяет вызывать метод и разрешает передачу массива, чтобы сообщить методу контекст обратного вызова. Это не только $ this, но и любая переменная объекта.

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

В приведенном выше примере, если Foo :: bar () является приватным, это не будет работать. Однако в исходном случае закрытый метод по-прежнему срабатывает из-за использования $ this в том же контексте, что и закрытый метод.

3 голосов
/ 24 февраля 2011

если он в том же классе, то в той же области видимости / контексте ($ this).

1 голос
/ 24 февраля 2011

Я полагаю, что подразумевается, что обратный вызов выполняется в текущей области. 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'));
    }
}

Это явно не задокументировано, что было бы удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...