php 钩子 实现
PHP 钩子实现方法
钩子(Hook)是一种在特定事件发生时插入自定义代码的机制,常用于插件系统或框架扩展。以下是几种常见的 PHP 钩子实现方式:
使用函数和全局变量
通过全局数组存储钩子函数,在特定事件触发时调用这些函数:
$hooks = [];
function add_hook($hook_name, $callback) {
global $hooks;
$hooks[$hook_name][] = $callback;
}
function do_hook($hook_name, $params = []) {
global $hooks;
if (isset($hooks[$hook_name])) {
foreach ($hooks[$hook_name] as $callback) {
call_user_func_array($callback, $params);
}
}
}
面向对象实现
采用面向对象方式封装钩子系统,提高可维护性:
class HookSystem {
private $hooks = [];
public function add($hook_name, $callback) {
$this->hooks[$hook_name][] = $callback;
}
public function trigger($hook_name, $params = []) {
if (isset($this->hooks[$hook_name])) {
foreach ($this->hooks[$hook_name] as $callback) {
call_user_func_array($callback, $params);
}
}
}
}
优先级支持
为钩子添加优先级支持,控制执行顺序:
class PriorityHook {
private $hooks = [];
public function add($hook_name, $callback, $priority = 10) {
$this->hooks[$hook_name][$priority][] = $callback;
}
public function trigger($hook_name, $params = []) {
if (isset($this->hooks[$hook_name])) {
ksort($this->hooks[$hook_name]);
foreach ($this->hooks[$hook_name] as $priority => $callbacks) {
foreach ($callbacks as $callback) {
call_user_func_array($callback, $params);
}
}
}
}
}
过滤器类型钩子
实现可修改返回值的过滤器钩子:
class FilterHook {
private $filters = [];
public function add($filter_name, $callback, $priority = 10) {
$this->filters[$filter_name][$priority][] = $callback;
}
public function apply($filter_name, $value, $params = []) {
if (isset($this->filters[$filter_name])) {
ksort($this->filters[$filter_name]);
foreach ($this->filters[$filter_name] as $priority => $callbacks) {
foreach ($callbacks as $callback) {
$value = call_user_func_array($callback, array_merge([$value], $params));
}
}
}
return $value;
}
}
实际应用示例
在框架中注册和使用钩子:
$hook = new HookSystem();
// 注册钩子
$hook->add('before_render', function($content) {
return "<!-- Header -->" . $content;
});
// 触发钩子
$content = $hook->apply('before_render', '<div>Page Content</div>');
这些方法展示了PHP中实现钩子的不同方式,从简单到复杂,可根据项目需求选择适合的实现方案。







