2010-05-08 2 views
1

я должен создать переменную, которая вызываемым с РНР is_callableкак передать параметр методу с РНР is_callable

Я сделал это:

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

Но я хочу передать параметр в метод.

Как я могу это сделать?

Причины использование компонента диспетчера события Symfony будет как:

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

Первый параметр это просто название события, вторым является вызываемым переменным.

Но я могу назвать метод write, я хочу передать ему параметр.

+0

'is_callable' фактически не вызывается метод, так почему вам нужно передать аргументы метода 'is_callable'? –

+1

Я считаю, что это больше проблема с Symphony, чем любая собственная функциональность PHP, почему бы не расширить метод connect для принятия параметров –

ответ

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; 
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); 
Смежные вопросы