当前位置:首页 > PHP

php 钩子实现

2026-02-15 21:37:49PHP

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);
        }
    }
}

面向对象的钩子实现

更结构化的方式是通过类实现钩子系统:

php 钩子实现

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实现:

php 钩子实现

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');

注意事项

  • 钩子名称应具有唯一性和描述性
  • 注意回调函数参数的传递方式
  • 考虑添加错误处理机制
  • 对于大型系统,建议使用成熟的钩子库或框架内置的钩子系统
  • 性能敏感场景需谨慎使用大量钩子

标签: 钩子php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…