ThinkPHP5源码学习篇--Hook.php

本文详细解析了ThinkPHP5中的Hook类,包括标签添加行为拓展、批量导入、获取标签行为列表及监听标签的执行过程。Hook类实现了类似AOP的面向切面编程,通过Hook::listen()方法在特定标签处执行公共逻辑。文章探讨了闭包、函数、类方法和静态方法的调用,以及如何控制行为的添加和执行顺序。通过对源码的分析,展示了Hook如何提高业务开发效率。
摘要由CSDN通过智能技术生成

Hook类解析

在学习TP5源码的过程中,经常有执行Hook::listen()的地方,一查原来是TP5的行为拓展,当应用程序执行到定义的标签时,能够拦截下来执行一些公共的逻辑。对AOP(面向切面编程)了解的不多,只知道在Java的实现中,通过配置文件,非常自由的决定前置、后置,以及应该被环绕的执行方法。从此方面来说,TP5的行为有点相像AOP功能,但是实现度和完整性略有不够。

Hook的功能可以区分为添加、监听、执行三块,虽然内容不多,但是利用的好可以提高我们的业务开发效率,因此还是很有必要研究一下的。

从Hook类的方法清单列表来入手


标签添加行为拓展

    /**
     * 动态添加行为扩展到某个标签
     * @access public
     * @param  string $tag      标签名称
     * @param  mixed  $behavior 行为名称
     * @param  bool   $first    是否放到开头执行
     * @return void
     */
    public static function add($tag, $behavior, $first = false)
    {
        //添加一个标签对应到behavior
        //判断是否已添加过当前$tag,若未添加过则$tag对应结构初始化为数组
        isset(self::$tags[$tag]) || self::$tags[$tag] = [];

        if (is_array($behavior) && !is_callable($behavior)) {
            //传入格式如:
            /*
            [
                'app\\index\\behavior\\Test',
                'app\\index\\behavior\\Test2'
            ]
             * 为可调用的行为类
             * */

            //判断是否_overlay键 且对应值是否为true
            if (!array_key_exists('_overlay', $behavior) || !$behavior['_overlay']) {
                //作追加操作
                unset($behavior['_overlay']);
                self::$tags[$tag] = array_merge(self::$tags[$tag], $behavior);
            } else {
                //_overlay是为true,作覆盖操作
                unset($behavior['_overlay']);
                self::$tags[$tag] = $behavior;
            }
        } elseif ($first) {
            //array_unshift — 在数组开头插入一个或多个单元
            //添加到数组开头
            array_unshift(self::$tags[$tag], $behavior);
        } else {
            //默认添加到数组尾部
            self::$tags[$tag][] = $behavior;
        }
    }

①结合isset()和||来初始化标签数组

②区分$behavior的参数类型来实现不同效果

$behavior是数组格式且不可被调用
is_callable()目前发现能够调用的四种情况

  1. 闭包函数
$callback = function () {
  return '123';
};
var_export(is_callable($callback));
//执行结果:true
  1. 函数
function func()
{
    return '123';
}
var_export(is_callable('func'));
//执行结果:true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值