Динамически создать метод экземпляра в PHP - PullRequest
8 голосов
/ 12 июля 2010

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

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в конструкторе.

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

Ответы [ 2 ]

18 голосов
/ 12 июля 2010

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

class Foo{

   function __construct() {
      $this->sayHi = create_function( '', 'print "hi";'); 
    }
}

$foo = new Foo;
$fn = $foo->sayHi;
$fn(); // hi

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

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

См. Руководство PHP по анонимным функциям для дальнейшего ознакомления.

3 голосов
/ 12 июля 2010

Вы можете использовать магический метод __ call для применения методов экземпляра во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...