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


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

У меня есть класс, конструктор которого принимает обратный вызов в качестве аргумента. В этом обратном вызове, я думаю, было бы наиболее семантически правильно, чтобы переменная $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

    } ...

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

Author: Brian Tompsett - 汤莱恩, 2011-08-19

1 answers

$that = $this;
cb(function () use ($that) {
    $that-> ...
});

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

 6
Author: deceze, 2011-08-18 22:33:33