[转]PHP hook钩子类

转载 2015年07月06日 21:33:49

不多说什么,用于做插件,消息监听之类的东西,反正用处挺大的,不清楚的请移步看看百科知识

  当然,代码之后只有使用的测试,而没有删除的测试,各种问题自行解决吧,还有功能不强,理论上应该可以设置优先级才对,但是这里不行,不完善的原因吧。

  基本原理还是很简单的,用列表存储对应的调用函数或方法,然后执行的时候调用并且返回一下就行了。还有钩子的作用是修改数据,所以必须传递一个参数过去,即使你用不到任何参数,发送个null参数过去也是可以的,并非没有意义,而是有时候部分数据很难直接调用,要使用全局变量或者通过其他方式获取的时候,空值也是不错的,至于返回对象,这个也必须的。

先贴类代码。

<?php
namespace Core;
/**
 * 系统钩子
 * @author loveyu
 */
class Hook{
    /**
     * 用于存放对应的构造列表
     * @var array
     */
    private $_hook_list;

    /**
     * 构造方法
     */
    public function __construct(){
        // TODO: Implement __construct() method.
        $this->_hook_list = array();
    }

    /**
     * 添加一个钩子到系统
     * @param string   $name
     * @param callback $func
     */
    public function add($name, $func){
        if(!isset($this->_hook_list[$name])){
            $this->_hook_list[$name] = array();
        }
        if(is_array($func)){
            $this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]] = $func;
        } else{
            $this->_hook_list[$name][$func] = $func;
        }
    }


    /**
     * 应用钩子,至少包含一个参数名
     * @param string $name   对应名称
     * @param mixed  $param1 第一个参数
     * @return mixed 返回调用的第一个参数
     */
    public function apply($name, $param1){
        if(isset($this->_hook_list[$name])){
            $args = array_slice(func_get_args(), 1);
            foreach($this->_hook_list[$name] as $v){
                $param1 = call_user_func_array($v, $args);
                $args[0] = $param1;
            }
        }
        return $param1;
    }

    /**
     * 移除对应的钩子
     * @param string          $name 钩子名称
     * @param callback|string $func 钩子对应的调用方法
     */
    public function remove($name, $func = ''){
        if(isset($this->_hook_list[$name])){
            if(empty($func)){
                unset($this->_hook_list[$name]);
            } else{
                if(is_array($func)){
                    if(isset($this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]]))
                        unset($this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]]);
                } else{
                    if(isset($this->_hook_list[$name][$func]))
                        unset($this->_hook_list[$name][$func]);
                }
            }
        }
    }
}
然后是测试代码。

<?php
/*
 * 系统钩子测试文件
 */
require("../core/hook.php");
$hook = new \Core\Hook();

/**
 * 回调函数
 * @param $data 默认输入数据,必须
 * @param $n1 附加数据,可选
 * @param $n2 附加数据,可选
 * @return string 返回数据,和$data类似
 */
function test_hook_callback($data, $n1, $n2){
    echo "Run at:" . __METHOD__ . "\n";
    return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
}

/**
 * 测试类
 */
class test_hook_class{
    /**
     * 类方法回调函数
     * @param $data 默认输入数据,必须
     * @param $n1 附加数据,可选
     * @param $n2 附加数据,可选
     * @return string 返回数据,和$data类似
     */
    public function callback($data, $n1, $n2){
        echo "Run at:" . __METHOD__ . "\n";
        return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
    }

    /**
     * 静态方法回调函数
     * @param $data 默认输入数据,必须
     * @param $n1 附加数据,可选
     * @param $n2 附加数据,可选
     * @return string 返回数据,和$data类似
     */
    public static function static_callback($data, $n1, $n2){
        echo "Run at:" . __METHOD__ . "\n";
        return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
    }
}

//函数回调
$hook->add('test_hook', 'test_hook_callback');

//静态方法回调
$hook->add('test_hook', 'test_hook_class::static_callback');

//实例化类
$test_class = new test_hook_class();
//添加方法
$hook->add('test_hook', array($test_class, 'callback'));

//需要处理的数据
$data = "loveyu";

//执行回调函数,顺序为添加顺序,必须存在两个及以上参数
$data = $hook->apply('test_hook', $data, 1, 2);

//输出最终数据
echo "\n".$data;

接着是运行结果输出数据。

Run at:test_hook_callback
Run at:test_hook_class::static_callback
Run at:test_hook_class::callback

loveyu
{1[test_hook_callback]2}
{1[test_hook_class::static_callback]2}
{1[test_hook_class::callback]2}

PHP的HOOK

PHP 的 HOOK使用

(插件设计与简单应用)php中钩子(hook)的应用示例demo

我们先来回顾下原本的开发流程; 产品汪搞出了一堆需求; 当用户注册成功后需要发送短信、发送邮件等等; 然后聪明机智勇敢的程序猿们就一扑而上; 把这些需求转换成代码扔在 用户注册成功 和 跳转到...

PHP 结合 WebHook 实现代码自动部署

最近一直在研究如何把在把代码 Push 到 Coding 上时能够实现自动部署最新代码到服务器上,解决方案就是利用 Coding 提供的 WebHook(其他 Git 仓库也应该有类似的功能)。 ...
  • zmhawk
  • zmhawk
  • 2017年06月15日 15:09
  • 887

PHP HOOK的若干方法

0x00 针对OP进行hook 在PHP内核中,每一个OP操作都是由一个固定的Handler函数去负责的,看_zend_op的结构体属性第一个就是opcode_handler_t,表示该OP对应的h...

CI框架源码阅读笔记6 扩展钩子 Hook.php

CI框架允许你在不修改系统核心代码的基础上添加或者更改系统的核心功能(如重写缓存、输出等)。例如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = ...

php ghook 全局钩子功能 v0

在 cms 系统中遇到过这种情况: 其它模块的数据需要关联会员模块的会员数据,所以在删除会员时应需要与会员数据关联的模块进行数据关联操作。 比如删除一个会员时同时删除此会员发布的文章。 但是,其...

PHP的钩子实现解析

PHP编程的钩子实现,示例讲解和解释它们的作用,写了一个样板的钩子实现 钩子是编程里一个常见的概念,非常的重要。它使得系统变得非常容易拓展(而不用理解其内部的实现机理,这样可以减少很多工作量)。只要有...

ThinkPHP的钩子实现原理

ThinkPHP中钩子Hook机制的原理钩子是一种触发机制,如同一个陷阱,当程序运行到某个地方时就会触发这个陷阱,然后执行这个Hook,执行完成后,系统根据执行的不同结果继续进行.关于这个理解我第一次...
  • csdnhyp
  • csdnhyp
  • 2017年02月01日 13:01
  • 893

php中的钩子理解及应用

钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递...

php 钩子函数

理解钩子Hook以及在Thinkphp下利用钩子使用行为扩展 什么是钩子函数 个人理解:钩子就像一个”陷阱”、”监听器”,当A发送一个消息到B时,当消息还未到达目的地B时,被钩子拦截调出一部分代码做...
  • lhls11
  • lhls11
  • 2016年06月09日 20:49
  • 656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]PHP hook钩子类
举报原因:
原因补充:

(最多只允许输入30个字)