澳门新莆京手机网站-新蒲京娱乐场 > 书籍 > 【澳门新莆京手机网站】php达成网站插件机制的情势

【澳门新莆京手机网站】php达成网站插件机制的情势

如上正是叁个插件机制的落实,over!

复制代码 代码如下:

/**
* 注册要求监听的插件方法(钩子)
*
* @param string $hook
* @param object $reference
*澳门新莆京手机网站, @param string $method
*/
function register($hook, &$reference, $method)
{
//获取插件要促成的不二秘诀
$key = get_class($reference).'->'.$method;
//将插件的引用连同方法push进监听数组中
$this->_listeners[$hook][$key] = array(&$reference, $method);
#此处做些日志记录方面包车型地铁东西
}
/**
* 触发贰个钩子
*
* @param string $hook 钩子的名目
* @param mixed $data 钩子的入参
* @return mixed
*/
function trigger($hook, $data='')
{
$result = '';
//查看要促成的钩,是或不是在监听数组之中
if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0)
{
// 循环调用起来
foreach ($this->_listeners[$hook] as $listener)
{
// 抽取插件对象的引用和方式
$class =& $listener[0];
$method = $listener[1];
if(method_exists($class,$method))
{
// 动态调用插件的不二等秘书技
$result .= $class->$method($data);
}
}
}
#此间做些日志记录方面包车型客车事物
return $result;
}
}
?>

type=trim; } /** * 获得事件字符串 */ 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; if($this->has($event,$method,$class)) return true; if{ $this->_check_method; $this->_callback_method[$eventstr][]=$this->_create_listener_method($eventstr,$class,$method); }else{ $this->_check_function; $this->_callback_method[$eventstr][]=$this->_create_listener_fn; } return true; } /** * 派发事件 * @param Event $event * @param string $method * @param string||object $class * @return void */ public function dispatch{ $eventstr=$this->_create_event_str; if($this->_check_callback{ foreach ($this->_callback_method[$eventstr] as $v){ if{ if(is_object{ $v['class']->$v['method']; }else{ call_user_func(array($v['class'], $v['method']),$event); } }else{ $v['function']; } } } } /** * 删除事件 * @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; if(!$this->_check_callback return true; if(!$this->has($event,$method,$class)) return true; if{ $this->_check_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; foreach ($this->_callback_method[$eventstr] as $k=>$v) { if(($v==$this->_create_listener_fn{ 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; if{ $this->_check_method; if($this->_check_callback{ foreach($this->_callback_method[$eventstr] as $v){ if(is_object{ $v_class=get_class; }else{ $v_class=$v['class']; } if{ $s_class=get_class; }else{ $s_class=$class; } $temp_v=array( "class"=>$v_class, "method"=>$method, ); $temp_s=array( "class"=>$s_class, "method"=>$method, ); if{ return true; } } } }else{ $this->_check_function; if($this->_check_callback{ 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{ if(!method_exists{ throw new Exception_Event." not exist ".$method." method",1); } } /** * 检查实验钦赐函数是不是存在 * @param string $function * @return void */ private function _check_function{ if(!function_exists{ throw new Exception_Event($function." function not exist ",2); } } /** * 检验钦点事件是还是不是存在监听函数 * @param string $eventstr * @return boolean */ private function _check_callback{ 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{ 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{ $classstr=strtolower; $eventstr=$event; return $classstr.$eventstr; } } class test extends EventDispatcher{ } function t; } $v=new test(); $e=new Event; $v->attach; $v->detact; echo $v->has; $e->a="dd"; $v->dispatch;

下一场是插件的实际完成情势:
复制代码 代码如下:

比如说笔者要将say_hello放到自个儿博客首页Index.php,那么你在index.php中的有个别地方写下:(作者原话)
复制代码 代码如下:
$pluginManager->trigger('demo','');

上一篇:粗略的PHP图片上传程序 下一篇:没有了

Copyright © 2015-2019 http://www.carrefourstation.com. 澳门新莆京手机网站-新蒲京娱乐场有限公司 版权所有