ホームページ  >  記事  >  バックエンド開発  >  PHPイベントの仕組み(2)_PHPチュートリアル

PHPイベントの仕組み(2)_PHPチュートリアル

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

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

class イベント extends stdClass{
public $target=null;
パブリック $type=null;
/**
* イベントの作成
* @param string $type
*/
パブリック関数 __construct($type){
$this->type=trim($type);
}
/**
* イベント文字列を取得します
*/
public function __toString(){
return $this->type;
}
}

抽象クラス EventDispatcher{
private $_callback_method;
/**
* 追加イベント
* @param Event $event
* @param string $method
* @param string||object $class
* @return boolean true
*/
パブリック関数attach($event,$method,$class=null){
$eventsstr=(string)$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
*/
public functiondispatch(Event $event){
$event->target=$this;
$eventstr=(文字列)$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,$method,$class=null){
$eventsstr=(string)$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[$eventstr][$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,$method,$class=null){
$eventsstr=(string)$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(get_class($class)." ではありません".$method." が存在します。1);
}
}
/**
* 指定された関数が存在するか確認します
* @param string $function
* @return void
*/
private function _check_function($function){
if(!function_exists($function)){
throw new Exception($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,
"メソッド"=>$メソッド,
);
}
}



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();
}
パブリック関数 kk($e){
print_r($e);
}
}


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

www.bkjia.com本当http://www.bkjia.com/PHPjc/323047.html技術記事例: ?php class Event extends stdClass{ public $target=null;パブリック $type=null; /*** イベントの作成 * @param string $type*/ パブリック関数 __construct($type)...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。