仿AS3实现PHP 事件机制
<?php /** * 事件异常 * * @author lonely * @create 2010-10-21 * @version 0.1 * @lastupdate lonely * @package Event */ class Exception_Event extends Exception {} /** * 事件对象 * * @author lonely * @create 2010-10-21 * @version 0.1 * @lastupdate lonely * @package Event */ 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; } } /** * 事件派发 * * @author lonely * @create 2010-10-21 * @version 0.1 * @lastupdate lonely * @package Event */ class EventDispatcher{ private $_callback_method; /** * 添加事件 * @param Event $event * @param string $method * @param string||object $class * @return boolean true */ public function attach(Event $event,$method,$class=null){ $event->target=$this; $eventstr=$this->_create_event_str($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){ $eventstr=$this->_create_event_str($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 $event,$method,$class=null){ $eventstr=$this->_create_event_str($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 $event,$method,$class=null){ $eventstr=$this->_create_event_str($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_Event(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_Event($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, ); } /** * 创建事件字符串 * @param Event $event * @return string */ private function _create_event_str(Event $event){ $classstr=strtolower(get_class($event)); $eventstr=(string)$event; return $classstr.$eventstr; } } class test extends EventDispatcher{ } function t($e){ print_r($e->a); } $v=new test(); $e=new Event("test"); $v->attach($e,"t"); $v->detact($e,"t"); echo $v->has($e,"t"); $e->a="dd"; $v->dispatch($e);
登录后复制
以上就是仿AS3实现PHP 事件机制的内容,更多相关内容请关注PHP中文网(www.php.cn)!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
刺客信条阴影:贝壳谜语解决方案
1 周前
By DDD
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
在哪里可以找到原子中的起重机控制钥匙卡
1 周前
By DDD

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu
