Intereting Posts
Столбец Mysql полностью работает в PhpMyadmin, но не с Php mysqli_query () Навигация по php-страницам по серийному номеру используя AJAX и JQuery для создания pdf с использованием FPDF функции автозагрузки в php Создание миграции из существующей базы данных в Laravel 4 Как я могу отправить уведомление Firebase Cloud Messaging без использования Firebase Console? Поиск и фильтрация / уточнение результатов базы данных в Laravel 4 Есть ли способ отключить ссылку href при щелчке на n дней использовать файлы cookie в JavaScript Какие проверки следует использовать для предотвращения прямого доступа к страницам (с использованием PHP)? Функции WSDL с тем же именем. Как выбрать один? Как узнать, является ли запрос ajax-запросом? Преобразование данных формы HTML в файл PDF с использованием PHP как вызвать ajax на интерфейсе wordpress как обновить раскрывающееся меню Select2 после загрузки ajax другого контента? Что лучше хранить массив stdClass или (object) для хранения связанных данных?

call_user_func в контексте класса (с указанным значением $)

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

Solutions Collecting From Web of "call_user_func в контексте класса (с указанным значением $)"

Доступ к $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);