Мне нужно реализовать следующий шаблон в 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
реализаций?