Переназначение $ this в PHP - PullRequest
       5

Переназначение $ this в PHP

4 голосов
/ 19 августа 2011

( Я понимаю, что это может быть обидным решением, но я был бы признателен, чтобы мы избегали ответов типа "Пожалуйста, не надо". )

У меня есть класс, конструктор которого принимает обратный вызов в качестве аргумента. В этом обратном вызове я думаю, что было бы наиболее семантически правильным, чтобы переменная $this была доступна как ссылка на экземпляр, которому принадлежит обратный вызов. ( Я заметил, что 5.4 восстановил $this в контексте анонимных функций , определенных в классе, однако даже это изменение здесь не поможет, поскольку функция передается в качестве аргумента указанный конструктор )

Проблема связана с тем, что экземпляр не передается в качестве аргумента для обратного вызова, а вместо этого становится доступным use()

use() имеет тенденцию плакать о $this, заявляя, что его нельзя использовать в качестве лексической переменной.

Есть ли способ, не передавая его в качестве аргумента ( любой подход, use() или нет, вполне вероятно, ), чтобы выполнить это?

От руки, единственное, о чем я могу думать, это что-то вроде:

 ... function($foo, $bar)
    use($array_with_this){
        extract($array_with_this); // contains instance with key 'this'

        // code using $this

    } ...

Но это требует дополнительного требования, которое мне не нужно.

1 Ответ

6 голосов
/ 19 августа 2011
$that = $this;
cb(function () use ($that) {
    $that-> ...
});

Это $this - специальное ключевое слово, его нельзя использовать вне контекста объекта.И анонимные функции в настоящее время выполняются вне контекста объекта.Это изменится в следующей версии PHP (5.4), по-видимому.

...