php is_callable ile yöntemine bir parametre geçirmek için nasıl

2 Cevap php

PHP'nin is_callable ile çağrılabilir bir değişken oluşturmak zorunda

Ben bunu yaptım:

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

Ama yöntemine bir parametre geçmek istiyorum.

Bunu nasıl yapabilirim?

Symfony'nin olay memuru bileşenini kullanarak neden gibi olacak:

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

İlk parametre ikinci çağrılabilir değişken, sadece bir olay adıdır.

Ama sadece ben ona bir parametre geçmek istiyorum, yazma yöntemini çağırabilirsiniz.

2 Cevap

Sen (çekirdek uzanan olmadan) sizin dinleyici olan geri parametreleri geçemiyor. Symfony çağıran biri olacak ve bir olay nesnesi geçecek. Ek bilgi gerekiyorsa, size parametrelerini kontrol edebilirsiniz başka bir yöntemi çağıran farklı bir yöntemi oluşturabilirsiniz.

$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);

Ve geri çağırma sınıf yöntemleri gibi bir şey olabilir:

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);
    }

}

Alternatif olarak, yazma fonksiyonu kontrol edebilirsiniz devlet olarak hareket özellikleri oluşturabilirsiniz:

class MyWriter
{
    public $state = 1;

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

Bu, yerinde bir olay durumun özelliklerine bağlı olarak, yapılamadı ispat olmayabilir hangi tetiklenir önce devlet kurmak zorundayız gibi zordur:

$callable[0]->state = 2;

PHP 5.3 'ten beri kullanabilirsiniz anonymous functions.

Böyle dinleyici bağlamak gerekir:

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

Sonra dinleyici parametreler dizisini almak mümkün olacaktır:

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

Şimdi olayı normal olarak bildirebilir:

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

Take care that this listener can't be disconnected. If you need to disconnect it, put the anonymous function in a variable:

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

Sen ile kesmek gerekir:

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