Сначала извините мой английский. Я не носитель языка и жаль, если он выглядит грубым, это первый раз, когда я публикую на этом сайте. Думаю, моя проблема довольно проста. Допустим, у нас есть:
class A { function foo() { function bar ($arg){ echo $this->baz, $arg; } bar("world !"); } protected $baz = "Hello "; } $qux = new A; $qux->foo();
В этом примере «$ this», очевидно, не относится к моему объекту «$ qux».
Как мне сделать, чтобы он ссылался на «$ qux»?
Как может быть в JavaScript: bar.bind(this, "world !")
PHP не имеет вложенных функций, поэтому в вашем примере bar
по существу глобальный. Вы можете добиться того, чего хотите, используя закрытие (= анонимные функции), которые поддерживают привязку с PHP 5.4:
class A { function foo() { $bar = function($arg) { echo $this->baz, $arg; }; $bar->bindTo($this); $bar("world !"); } protected $baz = "Hello "; } $qux = new A; $qux->foo();
UPD: однако bindTo($this)
не имеет большого смысла, поскольку закрытие автоматически наследует this
из контекста (опять же, в 5.4). Таким образом, ваш пример может быть просто:
function foo() { $bar = function($arg) { echo $this->baz, $arg; }; $bar("world !"); }
UPD2: для php 5.3 – это кажется возможным только с уродливым взломом:
class A { function foo() { $me = (object) get_object_vars($this); $bar = function($arg) use($me) { echo $me->baz, $arg; }; $bar("world !"); } protected $baz = "Hello "; }
Здесь get_object_vars()
используется для «публикации» защищенных / приватных свойств, чтобы сделать их доступными в закрытии.
Фактически, $this
ссылается на $qux
при вызове в этом контексте.
Вы не можете использовать $this
в контексте, отличном от метода объекта, поэтому, если вы приняли что-то вроде этого:
function test() { echo $this->baz; }
Это не сработает, независимо от того, что вы делаете.
для него это немного странно, но если вы используете функцию внутри функции, то, конечно, действуют некоторые закрывающие устройства. у вас может быть аналогичная проблема в javascript. Я бы предложил не использовать их вообще, но если по какой-то причине вы этого не хотите, тогда я бы попробовал это (не тестировался):
class A { function foo() { $that = $this; function bar ($arg){ echo $that->baz, $arg; } bar("world !"); } protected $baz = "Hello "; } $qux = new A; $qux->foo();
UPDATE, если вложенная функция действует как глобальная функция, вы можете передать свой объект в качестве параметра, если вам нужно его использовать:
функция foo () {
function bar ($o,$arg){ echo $o->baz, $arg; } bar($this,"world !"); }