ホームページ  >  記事  >  バックエンド開発  >  AS3を真似てPHPイベントメカニズム実装コード_PHPチュートリアル

AS3を真似てPHPイベントメカニズム実装コード_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:32:38858ブラウズ

コードをコピーします コードは次のとおりです:

/**
* イベント例外
*
* @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);

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322791.html技術記事复制代码代码如下: ?php /*** イベント例外 * * @authorlonely * @create 2010-10-21 * @version 0.1 * @lastupdatelonely * @package Event*/ class Exception_Event extends Exc...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。