コードをコピーします コードは次のとおりです:
/**
* イベント例外
*
* @author 寂しい
* @create 2010-10-21
* @バージョン 0.1
* @lastupdate 寂しい
* @package イベント
*/
class Exception_Event extends Exception {}
/**
* イベントオブジェクト
*
* @author 寂しい
* @create 2010-10-21
* @version 0.1
* @lastupdate 寂しい
* @package イベント
*/
class Event extends stdClass{
public $target=null;
パブリック $type=null;
/**
* イベントの作成
* @param string $type
*/
パブリック関数 __construct($type){
$this->type=trim($type);
}
/**
* イベント文字列を取得します
*/
public function __toString(){
return $this->type;
}
}
/**
* イベントディスパッチ
*
* @author 寂しい
* @create 2010-10-21
* @version 0.1
* @lastupdate 寂しい
* @package イベント
*/
class EventDispatcher{
private $_callback_method;
/**
* 追加イベント
* @param Event $event
* @param string $method
* @param string||object $class
* @return boolean true
*/
public functionattach(Event $event,$method,$class=null){
$event->target=$this;
$eventsstr=$this->_create_event_str($event);
if($this->has($event,$method,$class))
return true;
if($class!=null){
$this->_check_method($class,$method);
$this->_callback_method[$eventsstr][]=$this->_create_listener_method($eventsstr,$class,$method);
}else{
$this->_check_function($method);
$this->_callback_method[$eventsstr][]=$this->_create_listener_fn($eventsstr,$method);
}
true を返します。
}
/**
* イベントのディスパッチ
* @param Event $event
* @param string $method
* @param string||object $class
* @return void
*/
パブリック関数dispatch(Event $event){
$eventsstr=$this->_create_event_str($event);
if($this->_check_callback($eventsstr)){
foreach ($this->_callback_method[$eventsstr] as $v){
if($v['object']){
if(is_object( $v['クラス'])){
$v['クラス']->$v['メソッド']($event);
}else{
call_user_func(array($v['class'], $v['method']),$event);
}
}else{
$v['function']($event);
}
}
}
}
/**
* イベントの削除
* @param Event $event
* @param string $method
* @param string $class
* @return boolean true
*/
public function detact(Event $event,$method,$class=null){
$eventsstr=$this->_create_event_str($event);
if(!$this->_check_callback($eventsstr))
return true;
if(!$this->has($event,$method,$class))
return true;
if($class!=null){
$this->_check_method($class,$method);
foreach ($this->callback_method[$eventsstr] as $k=>$v) {
if(($v==$this->create_listener_method($eventsstr,$class,$method))){
unset($this->_callback_method[$eventsstr][$k]);
true を返します。
}
}
true を返します。
}else{
$this->_check_function($method);
foreach ($this->callback_method[$eventsstr] as $k=>$v) {
if(($v==$this->create_listener_fn($eventsstr,$method))){
unset( $this->_callback_method[$eventsstr][$k]);
true を返します。
}
}
true を返します。
}
}
/**
* イベントが監視されているかどうかを確認します
* @param Event $event
* @param string $method
* @param string $class
* @return boolean
*/
パブリック関数 has(Event $event,$method,$class=null){
$eventsstr=$this->_create_event_str($event);
if(($class!=null)){
$this->_check_method($class,$method);
if($this->_check_callback($eventsstr)){
foreach($this->_callback_method[$eventsstr] as $v){
if(is_object($v['class'])){
$ v_class=get_class($v['class']);
}else{
$v_class=$v['クラス'];
}
if(is_object($class)){
$s_class=get_class($class);
}else{
$s_class=$class;
}
$temp_v=array(
"クラス"=>$v_class,
"メソッド"=>$method,
);
$temp_s=array(
"クラス"=>$s_class,
"メソッド"=>$method,
);
if($temp_v==$temp_s){
true を返す;
}
}
}
}else{
$this->_check_function($method);
if($this->_check_callback($eventsstr)){
foreach($this->_callback_method[$eventsstr] as $v){
if($method==$v['function']){
true を返します。
}
}
}
}
false を返します。
}
/**
* 指定されたメソッドが指定されたクラスに存在するかどうかを確認します
* @param string $class
* @param string $method
* @Exception Exception_Event
* @return void
*/
プライベート関数 _check_method($class,$method){
if(!method_exists($class,$method)){
throw new Exception_Event(get_class($class)." ではありません".$method." が存在します。1);
}
}
/**
* 指定された関数が存在するか確認します
* @param string $function
* @return void
*/
プライベート関数 _check_function($function){
if(!function_exists($function)){
throw new Exception_Event($function." 関数が存在しません ",2);
}
}
/**
* 指定されたイベントのリッスン関数があるかどうかを確認します
* @param string $eventsstr
* @return boolean
*/
プライベート関数 _check_callback($eventsstr){
if(isset($this->_callback_method[$eventsstr])
&&is_array($this->_callback_method[$eventsstr]) ])
){
true を返します。
}
false を返します。
}
/**
* リスニング関数の配列を作成します
* @param string $eventsstr
* @param string $function
* @return array
*/
プライベート関数 _create_listener_fn($eventsstr,$function){
return array(
"object"=>false,
"function"=>$function,
);
}
/**
* リスニングクラスの配列を作成します
* @param string $eventsstr
* @param string $class
* @param string $method
* @return array
*/
プライベート関数 _create_listener_method($eventsstr,$class,$method){
return array(
"object"=>true,
"class"=>$class,
"メソッド"=>$メソッド,
);
}
/**
* イベント文字列を作成します
* @param Event $event
* @return string
*/
プライベート関数 _create_event_str(Event $event){
$classstr=strto lower(get_class($event));
$eventstr=(文字列)$event;
$classstr.$eventsstr を返します。
}
}
クラステストは、EventDispatcher{
}
function t($e){
print_r($e->a); を拡張します。
}
$v=新しいテスト();
$e=新しいイベント("テスト");
$v->attach($e,"t");
$v->detact($e,"t");
echo $v->has($e,"t");
$e->a="dd";
$v->ディスパッチ($e);
http://www.bkjia.com/PHPjc/322791.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/322791.html技術記事复制代码代码如下: ?php /*** イベント例外 * * @authorlonely * @create 2010-10-21 * @version 0.1 * @lastupdatelonely * @package Event*/ class Exception_Event extends Exc...