我必须使用php的is_callable
创建一个可调用的变量我做到了:
$callable = array(new MyClass, 'methodName');
但我想将参数传递给方法。
我该怎么做?
使用symfony的事件调度程序组件的原因如下:
$sfEventDispatcher->connect('log.write', array(new IC_Log('logfile.txt'), 'write'));
第一个参数只是一个事件名称,第二个参数是可调用的变量。
但我只能调用write方法,我想传递一个参数。
答案 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;