钩子程序的定义:
钩子是是一种消息处理机制,用户可以将钩子挂载到一个指定的目标处理程序,当监听到该目标处理程序触发时候,钩子可先于目标程序进行消息处理。
钩子程序即是钩子用于处理消息的一个程序段。
钩子程序的作用:
钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
钩子的应用方式和处理场景:
钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,用户在使用只需要挂载(卸载)相应的钩子,而钩子的处理程序都封装到相应的处理类中。钩子的应用,在增强系统扩展性的同时,增强了应用程序的可读性,使主干业务逻辑处理变得更新清晰。
处理场景例子:
(1)svn的钩子应用:
用户在提交代码文件时,挂载钩子程序该钩子程序将用户提交的代码文件先复制到web根目录,待钩子执行完后,再进行svn代码的版本控制
(2)应用程序的缓存控制:
在将页面数据显示给客户端的时候。用户可挂载缓存处理的钩子,该钩子可以用于读取页面缓存,如存在缓存钩子程序直接返回页面缓存数据。
代码实例:
代码示例一
- class Ball{
- public function down(){
- echo "ball is downing ";
- //注册事件
- Hook::add("man");
- Hook::add("Women");
- }
- public function do(){
- Hook::exec();
- }
- }
- // 钩子的定义
- class Hook{
- private $hooklist = null ;
- // 添加
- public function add($people){
- $this->hooklist[] = new $people();
- }
- // 触发事件
- public function exec(){
- foreach($this->hooklist as $people){
- $addon ->act();
- }
- }
- }
- // 钩子实现
- class man(){
- public function act(){
- echo 'notiong';
- }
- }
- class WoMan(){
- public function act(){
- echo 'oh my god ';
- }
- }
- class child(){
- public function act(){
- echo 'oh my god ';
- }
- }
- $ball = new Ball();
- $ball ->down();
- $ball ->do();
代码示例二
- // 如果需要添加小孩,就可以做添加一个小孩Hook::add("child");
- /*=========================钩子的升级版============================================/*
- class Hook{
- private $hookList;
- //添加
- function add($name,$fun){
- $this->hookList[$name][] = $fun;
- }
- function excec($name){
- $value = func_get_args();
- unset($value[0]);
- foreach ($this->hookList[$name] as $key => $fun) {
- call_user_func_array($fun, $value);
- }
- }
- }
- $hook = new Hook();
- $hook->add('women',function($msg){
- echo 'oh my god'.$msg ;
- })
- $hook->add('man',function($msg){
- echo 'nothing'.$msg ;
- })
- // 执行
- $hook->excec('man','taoge');
- $hook->excec('women','xxx');