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()目前发现能够调用的四种情况
- 闭包函数
$callback = function () {
return '123';
};
var_export(is_callable($callback));
//执行结果:true
- 函数
function func()
{
return '123';
}
var_export(is_callable('func'));
//执行结果:true