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

PHP 事件機(jī)制(2)

復(fù)制代碼 代碼如下:
<?php
class Event extends stdClass{
public $target=null;
public $type=null;
/**
* 創(chuàng)建事件
* @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;
}
/**
* 派發(fā)事件
* @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;
}
}
/**
* 檢測事件是否監(jiān)聽
* @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);
}
}
/**
* 檢測指定函數(shù)是否存在
* @param string $function
* @return void
*/
private function _check_function($function){
if(!function_exists($function)){
throw new Exception($function." function not exist ",2);
}
}
/**
* 檢測指定事件是否存在監(jiān)聽函數(shù)
* @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;
}
/**
* 創(chuàng)建監(jiān)聽函數(shù)數(shù)組
* @param string $eventstr
* @param string $function
* @return array
*/
private function _create_listener_fn($eventstr,$function){
return array(
"object"=>false,
"function"=>$function,
);
}
/**
* 創(chuàng)建監(jiān)聽類數(shù)組
* @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技術(shù)PHP 事件機(jī)制(2),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 纯肉无码AV在线看免费看 | 在线播放免费人成毛片视频 | 再深点灬舒服灬太大了在线视频 | 最新国产在线视频 | 亚洲最大日夜无码中文字幕 | 在线电台收听 | 久久精品麻豆国产天美传媒果冻 | 国产人妻精品久久久久久很牛 | 99在线观看视频免费 | 国产第一页浮力影院 | 国模丽丽啪啪一区二区 | 亚洲 欧美 国产 综合 播放 | 国产爱豆剧果冻传媒在线 | 久久精品亚洲热综合一本奇米 | 野花日本韩国视频免费高清观看 | 国产精品99久久久久久人韩国 | 久久精品黄色 | 久久精品亚洲AV高清网站性色 | 天美传媒MV高清免费看 | 无码爽死成人777在线观看网站 | 男人日女人的b | 午夜看片网 | 日本中文字幕巨大的乳专区 | 国产国产成年在线视频区 | 中文字幕成人 | 欧美性爱 先锋影音 | 欧美日韩黄色 | 99在线精品免费视频 | 日韩欧美高清一区 | 日本漫画母亲口工子全彩 | 亚洲成年人在线观看 | 九九色精品国偷自产视频 | 肉动漫无修3D在线观看 | 年轻的女教师2017韩国在线看 | 国产精品视频在线自在线 | 丝袜美女被啪啪不带套漫画 | 欧美丰满白嫩bbxx | 午夜免费无码福利视频麻豆 | 国产精品一区二区在线播放 | 亚瑟天堂久久一区二区影院 | 99精品国产免费久久久久久下载 |