Правильный способ выполнения делегатов или обратных вызовов в PHP

Мне нужно реализовать следующий шаблон в php:

class EventSubscriber
{
    private $userCode;
    public function __construct(&$userCode) { $this->userCode = &$userCode; }
    public function Subscribe($eventHandler) { $userCode[] = $eventHandler; }
}

class Event
{
    private $subscriber;
    private $userCode = array();

    public function __construct()
    {
        $this->subscriber = new Subscriber($this->userCode)
    }

    public function Subscriber() { return $this->subscriber; }

    public function Fire()
    {
        foreach ($this->userCode as $eventHandler)
        {
            /* Here i need to execute $eventHandler  */
        }
    }
}

class Button
{
    private $eventClick;

    public function __construct() { $this->eventClick = new Event(); }

    public function EventClick() { return $this->eventClick->Subscriber(); }

    public function Render()
    {
        if (/* Button was clicked */) $this->eventClick->Fire();

        return '<input type="button" />';
    }
}

class Page
{
    private $button;

    // THIS IS PRIVATE CLASS MEMBER !!!
    private function ButtonClickedHandler($sender, $eventArgs)
    {
        echo "button was clicked";
    }

    public function __construct()
    {
        $this->button = new Button();
        $this->button->EventClick()->Subscribe(array($this, 'ButtonClickedHandler'));
    }

    ...

}    

как это сделать правильно.

PS

Я использовал call_user_func для этой цели и хотите верьте, хотите нет смог вызвать членов частного класса, но после нескольких недель разработки я обнаружил, что он перестал работать. Была ли это ошибка в моем коде или что-то еще, что заставило меня подумать, что call_user_func может вызывать функции частного класса, я не знаю, но теперь я ищу простой, быстрый и элегантный метод безопасного вызов своего частного члена класса из другого класса. Я сейчас ищу закрытие, но у меня проблемы с закрытием $ this внутри ... {float x = foo (); printf ("возвращаемое значение:% f", x); возврат 0; } float foo () {возврат 5; но как мне справиться с 40 отдельными случаями, не имея 40 ICommand реализаций?

46
задан psubsee2003 13 December 2014 в 11:58
поделиться