如何创建使用对象上下文的运行时函数?

时间:2012-10-04 19:19:45

标签: php object dynamic methods lambda

我有一个类,我有一个动态创建的函数(通过“create_function”创建)但我找不到告诉PHP我想要只为这个类创建这个函数(类函数)的方法,因为新函数无法访问对象属性。看看下面的代码:

class Test {
  private $var=1;

  function __construct() {
      call_user_func(create_function('', 'echo $this->var;'));
  }
}

new Test;

抛出错误“致命错误:在D:\ WWW \ index.php(7)中不在对象上下文中时使用$ this:在第1行上运行时创建的函数”

2 个答案:

答案 0 :(得分:4)

您可能需要runkit_method_add,而不是create_function

答案 1 :(得分:3)

从php 5.4开始,anonymus函数在其上下文中也有$this。在魔术_call方法的帮助下,可以将闭包作为方法添加到类中,而无需其他代码:

class Test
{
  private $var = 1;

  function __construct()
  {
    $this->sayVar = function() { echo $this->var; };
  }

  public function __call( $method, $args )
  {
    if ( property_exists( $this, $method ) ) {
      if ( is_callable( $this->$method ) ) {
        return call_user_func_array( $this->$method, $args );
      }
    }
  }

}

$test = new Test();
$test->sayVar(); // echos 1