博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 事件机制(2)
阅读量:5308 次
发布时间:2019-06-14

本文共 5160 字,大约阅读时间需要 17 分钟。

于上一个版本的区别,把事件处理简化:

 

<?
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();
}

 

转载于:https://www.cnblogs.com/liushannet/archive/2011/03/22/1991551.html

你可能感兴趣的文章
Java for LeetCode 098 Validate Binary Search Tree
查看>>
Java for LeetCode 108 Convert Sorted Array to Binary Search Tree
查看>>
改变UITextField placeHolder 字体 颜色
查看>>
关于asp下gridview的一些问题
查看>>
《微信朋友圈,这么玩才赚钱》读书笔记-刘焱飞
查看>>
Factorial(hdu 1124)
查看>>
eclipse控制台中文乱码解决方法
查看>>
ASP.NET加载应用程序域
查看>>
StackExchange.Redis 管道 批量 高性能插入数据
查看>>
201506081340_《JavaScript秘密花园》
查看>>
web前端面试题合集 (HTML相关)
查看>>
泛型去重复项
查看>>
NpoI
查看>>
JAVA笔记13-异常处理Exception
查看>>
怎样永久关闭Win10自动更新_win10
查看>>
第三十四天 我为集成平台狂(七)-步履轻盈的JQuery(五)
查看>>
Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
查看>>
C#面向对象思想计算两点之间距离
查看>>
使用python+pychram进行API测试(接口测试)初级STEP 1
查看>>
jenkins2.0以后的版本提供自动部署和远程部署功能?
查看>>