如何使用php is_callable将参数传递给方法

时间:2010-05-08 19:19:27

标签: php oop symfony1 callback

我必须使用php的is_callable

创建一个可调用的变量

我做到了:

$callable = array(new MyClass, 'methodName');

但我想将参数传递给方法。

我该怎么做?

使用symfony的事件调度程序组件的原因如下:

$sfEventDispatcher->connect('log.write', array(new IC_Log('logfile.txt'), 'write'));

第一个参数只是一个事件名称,第二个参数是可调用的变量。

但我只能调用write方法,我想传递一个参数。

2 个答案:

答案 0 :(得分:2)

自PHP 5.3起,您可以使用anonymous functions

您应该像这样连接监听器:

$dispatcher->connect('my.event', function($event) { 
  $my_class = new MyClass;
  $my_class->myMethod($event, array('my_param' => 'my_value'));
});

然后您将能够在侦听器中获取参数数组:

class MyClass {
  public function myMethod(sfEvent $event, $parameters) {
    $my_value = $parameters['my_param'];
    $event_param_value = $event['event_param'];
  }
}

现在您可以正常通知该事件:

$dispatcher->notify(new sfEvent($this, 'my.event', array('event_param' => 'event_param_value')));

请注意不能断开此侦听器。 如果需要断开连接,请将匿名函数放在变量中:

$dispatcher->connect('my.event', $my_listener = function($event) { 
  $my_class = new MyClass;
  $my_class->myMethod($event, array('my_param' => 'my_value'));
});

您应该可以断开连接:

$dispatcher->disconnect('my.event', $my_listener);

答案 1 :(得分:1)

您不会将参数传递给侦听器回调(不扩展核心)。 Symfony将是调用它的人,并将传递一个事件对象。如果您需要其他信息,可以创建一个不同的方法来调用另一个可以控制参数的方法。

$callable1 = array(new MyWriter, 'write1');
$callable2 = array(new MyWriter, 'write2'); // or $callable2 = array($callable1[0], 'write2');

$sfEventDispatcher->connect('log.write', $callable1);
$sfEventDispatcher->connect('log.write', $callable2);

你的回调类方法可以是:

class MyWriter
{
    public function write($event, $num)
    {
        // do something
    }

    public function write1($event)
    {
        $this->write($event, 1);
    }

    public function write2($event)
    {
        $this->write($event, 2);
    }

}

或者,您可以创建充当写函数可以检查的状态的属性:

class MyWriter
{
    public $state = 1;

    public function write($event)
    {
        if ($this->state == 1) {
            // do this
        } else {
            // do this instead
        }   
    }
}

这比较棘手,因为您必须在触发相关事件之前设置状态,这可能不可行,具体取决于您的具体情况:

$callable[0]->state = 2;