天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 事件機制(2)

復制代碼 代碼如下:
<?php
class Event extends stdClass{
public $target=null;
public $type=null;
/**
* 創建事件
* @param string $type
*/
public function __construct($type){
$this->type=trim($type);
}
/**
* 得到事件字符串
*/
public function __toString(){
return $this->type;
}
}

abstract class EventDispatcher{
private $_callback_method;
/**
* 添加事件
* @param Event $event
* @param string $method
* @param string||object $class
* @return boolean true
*/
public function attach($event,$method,$class=null){
$eventstr=(string)$event;
if($this->has($event,$method,$class))
return true;
if($class!=null){
$this->_check_method($class,$method);
$this->_callback_method[$eventstr][]=$this->_create_listener_method($eventstr,$class,$method);
}else{
$this->_check_function($method);
$this->_callback_method[$eventstr][]=$this->_create_listener_fn($eventstr,$method);
}
return true;
}
/**
* 派發事件
* @param Event $event
* @param string $method
* @param string||object $class
* @return void
*/
public function dispatch(Event $event){
$event->target=$this;
$eventstr=(string)$event;
if($this->_check_callback($eventstr)){
foreach ($this->_callback_method[$eventstr] as $v){
if($v['object']){
if(is_object($v['class'])){
$v['class']->$v['method']($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,$method,$class=null){
$eventstr=(string)$event;
if(!$this->_check_callback($eventstr))
return true;
if(!$this->has($event,$method,$class))
return true;
if($class!=null){
$this->_check_method($class,$method);
foreach ($this->_callback_method[$eventstr] as $k=>$v) {
if(($v==$this->_create_listener_method($eventstr,$class,$method))){
unset($this->_callback_method[$eventstr][$k]);
return true;
}
}
return true;
}else{
$this->_check_function($method);
foreach ($this->_callback_method[$eventstr] as $k=>$v) {
if(($v==$this->_create_listener_fn($eventstr,$method))){
unset($this->_callback_method[$eventstr][$k]);
return true;
}
}
return true;
}
}
/**
* 檢測事件是否監聽
* @param Event $event
* @param string $method
* @param string $class
* @return boolean
*/
public function has($event,$method,$class=null){
$eventstr=(string)$event;
if(($class!=null)){
$this->_check_method($class,$method);
if($this->_check_callback($eventstr)){
foreach($this->_callback_method[$eventstr] as $v){
if(is_object($v['class'])){
$v_class=get_class($v['class']);
}else{
$v_class=$v['class'];
}
if(is_object($class)){
$s_class=get_class($class);
}else{
$s_class=$class;
}
$temp_v=array(
"class"=>$v_class,
"method"=>$method,
);
$temp_s=array(
"class"=>$s_class,
"method"=>$method,
);
if($temp_v==$temp_s){
return true;
}
}
}
}else{
$this->_check_function($method);
if($this->_check_callback($eventstr)){
foreach($this->_callback_method[$eventstr] as $v){
if($method==$v['function']){
return true;
}
}
}
}
return false;
}
/**
* 檢測指定類是否存在指定方法
* @param string $class
* @param string $method
* @exception Exception_Event
* @return void
*/
private function _check_method($class,$method){
if(!method_exists($class,$method)){
throw new Exception(get_class($class)." not exist ".$method." method",1);
}
}
/**
* 檢測指定函數是否存在
* @param string $function
* @return void
*/
private function _check_function($function){
if(!function_exists($function)){
throw new Exception($function." function not exist ",2);
}
}
/**
* 檢測指定事件是否存在監聽函數
* @param string $eventstr
* @return boolean
*/
private function _check_callback($eventstr){
if(isset($this->_callback_method[$eventstr])
&&is_array($this->_callback_method[$eventstr])
){
return true;
}
return false;
}
/**
* 創建監聽函數數組
* @param string $eventstr
* @param string $function
* @return array
*/
private function _create_listener_fn($eventstr,$function){
return array(
"object"=>false,
"function"=>$function,
);
}
/**
* 創建監聽類數組
* @param string $eventstr
* @param string $class
* @param string $method
* @return array
*/
private function _create_listener_method($eventstr,$class,$method){
return array(
"object"=>true,
"class"=>$class,
"method"=>$method,
);
}
}



class myevent extends Event{
const aa='aaa';
}
class ball extends EventDispatcher{
public function aa(){
$event=new myevent(myevent::aa);
$this->dispatch($event);
}
}

class mytest {
public function test(){
$ball=new ball();
$ball->attach(myevent::aa,'kk');
$ball->aa();
}
public function kk($e){
print_r($e);
}
}


try{
$t=new mytest();
$t->test();
}catch (Exception $e){
echo $e->getmessage();
}

php技術PHP 事件機制(2),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲一区二区三区乱码在线欧洲 | 亚州精品视频 | 永久免费的污视频网站 | 曰批国产精品视频免费观看 | 嫩草欧美曰韩国产大片 | 超碰98人人插 | 亚洲伊人色 | 美女被C污黄网站免费观看 美女白虎穴 | 一区二区三区内射美女毛片 | 亚洲视频免费看 | 5g在线视讯年龄确认海外禁止进入 | 日本久久精品视频 | 免费精品一区二区三区AA片 | 国产在线亚洲v天堂a | YY600800新视觉理论私人 | 国产WW久久久久久久久久 | 色综合久久88一加勒比 | 少妇的肉体AA片免费 | 免费。色婬网站 | 在线观看日本免费 | 无限资源在线观看8 | 国产亚洲日韩在线播放不卡 | 久久99精品涩AV毛片观看 | 亚洲视频精品在线观看 | 肉动漫3D卡通无修在线播放 | 夜夜女人国产香蕉久久精品 | 黄得让人湿的片段 | 国产黄A片在线观看永久免费麻豆 | 99在线播放 | 曰本xxⅹ孕妇性xxx | 午夜一个人在线观看完整版 | 97国产成人精品视频 | av网站视频在线观看 | 97在线播放视频 | 亲胸吻胸添奶头GIF动态图免费 | 亚洲高清视频网站 | 中文字幕蜜臀AV熟女人妻 | 亚洲视频欧美在线专区 | 暖暖日本手机免费完整版在线观看 | 一个人在线观看视频 | 99视频精品国产在线视频 |