如提:
小魯想在PHP上實現類似 C#的 Event 功能來做上下層物件的溝通橋樑 初步構想是 想說C# Event 基底雖然是delegate 但是使用的時候都是用包裝的class Action 那就用class來實現看看吧~ 所以出現了下面的Code...
<?php
class EventObject
{
private $events =[];
public function Add( $eventName ,callable $event)
{
if(array_key_exists($eventName ,$this->events))
throw new Exception("Duplicate EventName !!");
if(!is_string($eventName))
throw new Exception("EventName Must be String!!");
$this->events[$eventName] =$event;
}
public function Remove($eventName)
{
if(!array_key_exists($eventName,$this->events))
return;
unset($this->events[$eventName]);
}
public function Send( $parameter = null)
{
if(count( $this->events)==0)
return;
if(isset($parameter)){
foreach($this->events as $event){
call_user_func($event ,$parameter);
}
return;
}
foreach($this->events as $event){
call_user_func($event);
}
}
public function Clear()
{
$this->events =[];
}
}
?>
然後使用的方法...
發事件的物件~
<?php
class Mod
{
protected $onGetExceptonEvent;
public function __construct()
{
$this->onGetExceptonEvent = new EventObject();
}
public function ListenGetExceptonEvent( $eventname ,callable $call)
{
$this->onGetExceptonEvent->Add($eventname ,$call);
}
protected function SendGetExceptonEvent($array)
{
$this->onGetExceptonEvent->Send($array);
}
}
?>
上層物件~
<?php
class Controller
{
private $mod =null;
public function __construct()
{
$this->mod = new mod();
$this->mod->ListenGetExceptonEvent( "OnGetExceptonHandler" ,
function($array){$this->OnGetExceptonHandler($array);}
);
}
private function OnGetExceptonHandler($array){
//TODO
}
}
?>
雖然上面得Code已經可以正常運作了 但是使用起來總覺得不向C#的Event方便
像是 eventobject是物件 所以要用private藏起來 要給別人聽 要另外寫的函式來給別人聽
像是 監聽時要給函式 要用匿名函式包起來 才塞得進去 (這個我試好久)
像是 在發送事件的時候沒辦法知道要塞幾個參數進去可能會誤用什麼的...
小魯的PHP語法還在學習中 不知道大神們有沒有"方法"或是"建議"幫小魯改善這個功能讓他再方便點
感恩