2

有没有更好的方法在类中调用匿名函数?这是一个简单的示例,可以清楚地说明我的意思。

class foo
{
     private $call_back_1 = null;
     private $call_back_2 = null;

     function __construct($func1, $func2)
     {
          $this->call_back_1 = func1;
          $this->call_back_2 = func2;
     }


     function provokeCallBacks()
     {
          //this does not work, and gives an error  
          $this->call_back_1();


          //I would like to avoid this
          $method = $this->call_back_2;
          $method(); 
     }
}

$call1 = function(){ echo "inside call 1"};
$call2 = function(){ echo "inside call 2"};

$test = new foo(call1, call2);

$test->provokeCallBacks();

* 更新 1:请忽略任何语法错误,因为我是为演示目的而即时编写的。*

在 foo:provokeCallBacks 中,我试图调用匿名函数,但第一种方法不起作用并给出错误。第二个有效,但我必须使用一个名为“$method”的临时变量来进行调用,这有点愚蠢。

我想知道是否存在调用匿名函数的更好方法。

4

5 回答 5

4
call_user_func($this->call_back_1);
于 2012-09-26T13:27:58.227 回答
2

不,不可能通过$this.

另一种选择是;

call_user_func($this->call_back_1);
于 2012-09-26T13:30:13.143 回答
2

由于 PHP 是松散类型的,它不能像这样{$this -> callback}();您必须将其存储在临时变量中或使用call_user_func()其中任何一个。

编辑 - 考虑这样的事情:

class Lambdas
{

    protected $double;
    protected $triple;  

    public function __construct($double, $triple)
    {

        $this -> double = $double;
        $this -> triple = $triple;      

    }

    public function __call($name, $arguments)
    {

        if( is_callable($this -> {$name}) ){

            return call_user_func_array($this -> {$name}, $arguments);

        }

    }

}

$lambdas = new Lambdas(
    function($a){ return $a * 2;},
    function($a){ return $a * 3;}
);

echo $lambdas -> double(2); // prints 4
echo $lambdas -> triple(2); // prints 6
于 2012-09-26T13:31:41.653 回答
1

肮脏和危险,但你可能会成功使用 eval..

class foo
{
  private $call_back_1 = null;
  private $call_back_2 = null;

  function __construct($func1, $func2)
  {
      $this->call_back_1 = func1;
      $this->call_back_2 = func2;
  }


  function provokeCallBacks()
  {
      eval($this->call_back_1);
      eval($this->call_back_2);
  }
}

call1 = 'echo "inside call 1"';
call2 = 'echo "inside call 2"';

$test = foo(call1, call2);

$test->provokeCallBacks();
于 2012-09-26T13:34:27.333 回答
1

我知道您的问题已得到解答,但您可以尝试更改您的方法..

class Foo {
    private $calls = array();
    function __set($key, $value) {
        $this->calls[$key] = $value;
    }
    function __call($name, $arg) {
        if (array_key_exists($name, $this->calls)) {
            $this->calls[$name]();
        }
    }

    function __all() {
        foreach ( $this->calls as $call ) {
            $call();
        }
    }
}

$test = new Foo();

$test->A = function () {
    echo "inside call 1";
};

$test->B = function () {
    echo "inside call 2";
};

$test->A(); // inside call 1
$test->B(); // inside call 2
$test->__all(); // inside call 1 & inside call 2
于 2012-09-26T13:40:15.010 回答