Я хотел бы смочь динамично создать метод экземпляра в конструкторе класса как так:
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 для использования методов экземпляра времени выполнения.
class Foo
{
public function __call($name, $args)
{
if ($name == 'myFunc') {
// call myFunc
}
}
}