php 钩子实现
PHP 钩子实现方法
钩子(Hook)是一种允许在特定事件发生时插入自定义代码的机制,常用于插件系统或框架扩展。以下是几种常见的PHP钩子实现方式:
基于函数的钩子实现
注册和触发钩子的简单方法是通过函数和数组存储回调:
$hooks = [];
function add_hook($hook_name, $callback) {
global $hooks;
$hooks[$hook_name][] = $callback;
}
function trigger_hook($hook_name, $params = []) {
global $hooks;
if (isset($hooks[$hook_name])) {
foreach ($hooks[$hook_name] as $callback) {
call_user_func_array($callback, $params);
}
}
}
面向对象的钩子实现
更结构化的方式是通过类实现钩子系统:

class HookManager {
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);
}
}
}
}
}
WordPress风格的钩子实现
参考WordPress的add_action和do_action实现:

function add_action($hook_name, $callback, $priority = 10, $accepted_args = 1) {
global $wp_actions;
$wp_actions[$hook_name][$priority][] = [
'function' => $callback,
'accepted_args' => $accepted_args
];
}
function do_action($hook_name, ...$args) {
global $wp_actions;
if (isset($wp_actions[$hook_name])) {
ksort($wp_actions[$hook_name]);
foreach ($wp_actions[$hook_name] as $priority => $callbacks) {
foreach ($callbacks as $callback) {
call_user_func_array(
$callback['function'],
array_slice($args, 0, $callback['accepted_args'])
);
}
}
}
}
过滤器钩子实现
返回值的过滤器类型钩子实现:
class Filter {
private $filters = [];
public function add($filter_name, $callback, $priority = 10) {
$this->filters[$filter_name][$priority][] = $callback;
}
public function apply($filter_name, $value, ...$args) {
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], $args));
}
}
}
return $value;
}
}
钩子使用示例
注册并触发一个简单的钩子:
// 注册钩子
add_hook('before_content', function() {
echo "<header>网站头部</header>";
});
// 触发钩子
trigger_hook('before_content');
使用面向对象方式的钩子:
$hook = new HookManager();
$hook->add('after_content', function() {
echo "<footer>网站底部</footer>";
});
$hook->trigger('after_content');
注意事项
- 钩子名称应具有唯一性和描述性
- 注意回调函数参数的传递方式
- 考虑添加错误处理机制
- 对于大型系统,建议使用成熟的钩子库或框架内置的钩子系统
- 性能敏感场景需谨慎使用大量钩子






