php実装イベントバインド
最近yiiソースコードを追跡する中でバインドイベントの行為などに関連して、そこで自分で1つの最も簡単なイベントバインドの実現を手書きしました
結果は次のとおりです.
class EventHandle {
private static $_map = array();
// jquery
public function on($name, $callback)
{
if(!is_callable($callback))
return false;
if(!isset(self::$_map[$name]))
{
self::$_map[$name] = array();
}
self::$_map[$name][] = $callback;
}
//
public function trigger($name, $event)
{
if(!isset(self::$_map[$name]))
return false;
$function_arr = self::$_map[$name];
foreach($function_arr as $function)
{
call_user_func($function, $event);
}
return true;
}
//
public function remove($name, $callback)
{
if(!isset(self::$_map[$name]))
return false;
$map = self::$_map[$name];
$pos = array_search($callback, $map, true);
if($pos >= 0)
{
array_splice($map, $pos, 1);
self::$_map[$name] = $map;
}
return true;
}
}
//
class Event {
public static $options = array();
public function __construct($options = array())
{
$this->options = $options;
}
}
//
function start1($event)
{
echo 'start1asdaa
';
var_dump($event);
}
//
class EventCallback {
public function start3($event)
{
echo 'start3
';
}
}
$eventhandle = new EventHandle();
$eventhandle->on('start', "start1");
$eventhandle->on('start', array("EventCallback", "start3"));
$eventhandle->remove('start', array("EventCallback", "start3"));
$eventhandle->trigger('start', new Event(array('name' => 'hhhh', 'age' => 25)));
結果は次のとおりです.
start1asdaa
object(Event)[2] public 'options' =>
array (size=2)
'name' => string 'hhhh' (length=4)
'age' => int 25