仿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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
2週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
1 か月前
By DDD
R.E.P.O.最高のグラフィック設定
2週間前
By 尊渡假赌尊渡假赌尊渡假赌
アサシンのクリードシャドウズ:シーシェルリドルソリューション
1週間前
By DDD
R.E.P.O.誰も聞こえない場合はオーディオを修正する方法
2週間前
By 尊渡假赌尊渡假赌尊渡假赌

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。
