Intereting Posts
PHP PDO: выборка данных как объектов – свойств, назначенных ПЕРЕД вызовом __construct. Это верно? создание скриншота веб-сайта с использованием jquery Заголовок Content-Length всегда равен нулю Загрузка API YouTube v3 на канал Как прикрепить изображение к узлу при его создании с помощью node_save ($ node); Как распечатать список с использованием иерархической структуры данных? SOAP-ERROR: Кодирование: нарушение правил кодирования? Доступ к контейнеру DI Запустить PHP-скрипт в фоновом режиме при запуске / перезагрузке Apache (Windows Server) Запрос Curl, показывающий различный контент по сравнению с запросом браузера Как вы делаете простые вещи в Magento? Как получить значение hash (#) в строке запроса Вызов функции jquery после определенного скрипта php с параметрами Создание PDF. Как я могу заставить это работать? Ошибки, населяющие Laravel – как передать параметр маршруту? Есть ли более эффективная практика?

Динамическое создание метода экземпляра в PHP

Я хотел бы иметь возможность динамически создавать метод экземпляра внутри конструктора класса следующим образом:

class Foo{ function __construct() { $code = 'print hi;'; $sayHi = create_function( '', $code); print "$sayHi"; //prints lambda_2 print $sayHi(); // prints 'hi' $this->sayHi = $sayHi; } } $f = new Foo; $f->sayHi(); //Fatal error: Call to undefined method Foo::sayHi() in /export/home/web/private/htdocs/staff/cohenaa/dev-drupal-2/sites/all/modules/devel/devel.module(1086) : eval()'d code on line 12 

Проблема заключается в том, что объект функции lambda_2 не привязан к $ this внутри конструктора.

Любая помощь приветствуется.

Вы назначаете анонимную функцию для свойства , но затем пытаетесь вызвать метод с именем свойства. PHP не может автоматически разыменовать анонимную функцию из свойства. Будет выполнено следующее:

 class Foo{ function __construct() { $this->sayHi = create_function( '', 'print "hi";'); } } $foo = new Foo; $fn = $foo->sayHi; $fn(); // hi 

Вы можете использовать магический метод __call для перехвата недействительных вызовов методов, чтобы увидеть, есть ли свойство, содержащее функцию обратного вызова / анонимного:

 class Foo{ public function __construct() { $this->sayHi = create_function( '', 'print "hi";'); } public function __call($method, $args) { if(property_exists($this, $method)) { if(is_callable($this->$method)) { return call_user_func_array($this->$method, $args); } } } } $foo = new Foo; $foo->sayHi(); // hi 

Начиная с PHP5.3, вы также можете создавать Lambdas с

 $lambda = function() { return TRUE; }; 

Дополнительную информацию см. В руководстве по PHP для анонимных функций .

Вы можете использовать метод __call magic для использования методов экземпляра времени выполнения.

 class Foo { public function __call($name, $args) { if ($name == 'myFunc') { // call myFunc } } }