Есть ли способ выполнить закрытие в PHP5.3 в контексте объекта?
class Test { public $name='John'; function greet(){ eval('echo "Hello, ".$this->name;'); call_user_func(function(){ echo "Goodbye, ".$this->name; }); } } $c = new Test; $c->greet();
Eval () будет работать нормально, однако у call_user_func не будет доступа к $ this. ( Используя $ this, если не в контексте объекта ). Я передаю «$ this» как аргумент для закрытия прямо сейчас, но это не совсем то, что мне нужно.
Доступ к $this
невозможно из лямбда или закрытия с PHP 5.3.6. Вам нужно либо назначить $this
для temp var, либо использовать его с use
(что означает, что вы будете иметь только открытый API) или передать / использовать требуемое свойство. Все показано в другом месте на этом сайте, поэтому я не буду повторять.
Доступ к $this
доступно в Trunk, хотя для PHP.next: http://codepad.viper-7.com/PpBXa2
Для фактического закрытия это единственный способ сделать это:
$obj = $this; call_user_func(function () use ($obj) { echo "Goodbye, " . $obj->name; });
Возможно, более элегантно передать объект в качестве параметра, как предложено в других ответах (и, вероятно, как вы уже это делали).
как насчет:
class Test { public $name='John'; function greet(){ eval('echo "Hello, ".$this->name;'); call_user_func(function($obj){ echo "Goodbye, ".$obj->name; }, $this); } } $c = new Test; $c->greet();
call_user_func(function($name){ echo "Goodbye, ".$name; }, $this->Name);