PHP-эквивалент привязки JavaScript

Сначала извините мой английский. Я не носитель языка и жаль, если он выглядит грубым, это первый раз, когда я публикую на этом сайте. Думаю, моя проблема довольно проста. Допустим, у нас есть:

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 !"); }