Динамично создайте метод экземпляра в 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 в конструкторе.

Любая справка ценится.

8
задан Aaron 12 July 2010 в 19:00
поделиться

2 ответа

Вы присваиваете анонимную функцию свойству, но затем пытаетесь вызвать метод с именем свойства. 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 по анонимным функциям для дальнейшей справки.

18
ответ дан 5 December 2019 в 07:56
поделиться

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

class Foo
{
    public function __call($name, $args) 
    {
        if ($name == 'myFunc') {
            // call myFunc
        }
    }
}
3
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: