InitPHP框架Hook机制解读

wordpress受到大部分人的追捧是因为它有一个强大的挂件机制,这个机制可以让全世界各地不同的开发者参与进来,并且不影响原有核心程序代码。

今天来分析下,initphp框架中对hook的处理:

	/**
	 *	InitPHP Hook钩子函数
	 *
	 *  @param  string $class  钩子名称
	 *  @param  array  $function  
	 *  @return object
	 */
	public static function hook($hookname, $data = '') {
		global $InitPHP_conf;
		//配置文件
		$hookconfig = $InitPHP_conf['hook']['path'] . '/' . $InitPHP_conf['hook']['config'];
		if (!isset(self::$instance['inithookconfig']) && file_exists($hookconfig)) {
			self::$instance['inithookconfig'] = require_once($hookconfig);
		}
		if (!isset(self::$instance['inithookconfig'][$hookname])) return false;
		if (!is_array(self::$instance['inithookconfig'][$hookname])) {
			self::_hook(self::$instance['inithookconfig'][$hookname][0], self::$instance['inithookconfig'][$hookname][1], $data);
		} else {
			foreach (self::$instance['inithookconfig'][$hookname] as $v) {
				self::_hook($v[0], $v[1], $data);
			}
		}

	}
	
	/**
	 *	InitPHP Hook钩子具体处理函数
	 *
	 *  @param  string $class  钩子的类名
	 *  @param  array  $function  钩子方法名称
	 *  @return object
	 */
	private static function _hook($class, $function, $data = '') {
		global $InitPHP_conf;
		//类处理
		if (preg_match('/[^a-z0-9\-_.]/i', $class)) return false;	
		$file_name  = $InitPHP_conf['hook']['path'] . '/' . $class . $InitPHP_conf['hook']['file_postfix']; 
		$class_name = $class . $InitPHP_conf['hook']['class_postfix']; //类名
		if (!file_exists($file_name)) return false;
		if (!isset(self::$instance['inithook'][$class_name])) {
			require_once($file_name);
			if (!class_exists($class_name)) return false;
			$init_class = new $class_name;
			self::$instance['inithook'][$class_name] = $init_class;
		}
		if (!method_exists($class_name, $function)) return false;
		return self::$instance['inithook'][$class_name]->$function($data);
	}


这两个函数是initphp.php核心运行类文件中的两个函数,使用方法:InitPHP::hook('钩子名称','额外传递参数'),钩子可以在Controller中直接使用,也可以在模板中使用。钩子放置一般在程序员开发中,大概知道这个地方会扩展,但是现在项目中又不需要开发这个功能的时候,可以放置一个钩子。

 

/*************initphp.conf.php配置*************/
/* hook插件机制 - 插件文件目录 */
$InitPHP_conf['hook']['path']          = 'lib/hook'; //插件文件夹目录, 不需要加'/'
$InitPHP_conf['hook']['class_postfix'] = 'Hook'; //默认插件类名后缀
$InitPHP_conf['hook']['file_postfix']  = '.hook.php'; //默认插件文件名称
$InitPHP_conf['hook']['config']        = 'hook.conf.php'; //配置文件

 

可以看到这个是框架的一个hook配置类,可以配置钩子实现的类的存放文件夹、后缀名称、配置文件名称等。

 

/* hook的实现,都依赖于hook.conf.php配置文件 每个钩子实现都需要配置这个挂载conf */
/*
 *  钩子名称 => array(array('挂钩上对应的类名称', '函数名称')) 一个挂钩多个函数
 *  钩子名称 => array(挂钩上对应的类名称,函数名称) //一个挂钩一个钩子函数
 */
return array(
    //guest挂钩,InitPHP::hook('guest','Hook'); 在程序中放置钩子,guest钩子名称,Hook传递的参数
    'guest' => array( 
        array('test', 'run'), 
        array('test', 'aa')
    )
);


这个是hook.conf.php,挂钩的配置文件,这个配置文件存放在hook文件的目录下面,这个配置文件告诉挂钩,你的挂钩上加载了哪些类的函数。

 

/* 实现钩子,test.hook.php */
//一个测试的钩子
class testHook {
    public function run($data) {
          echo '第一个简单的' . $data;
    }
    
    public function aa($data) {
        echo '<BR>第二个简单的' . $data;
    }
}


具体实现钩子函数。这个类名为test,实现了一个run函数和一个aa函数,这两个函数挂载在上面配置文件中的guest钩子函数上,这样只要在使用InitPHP::hook('guest')都会来触发这两个函数。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值