当前位置:首页 > PHP

php 钩子 实现

2026-02-14 16:41:47PHP

php 钩子 实现

php 钩子 实现

PHP 钩子实现方法

钩子(Hook)是一种常见的编程模式,允许在特定事件发生时插入自定义代码。PHP中可以通过多种方式实现钩子机制。

使用函数和数组存储钩子

$hooks = [];

function add_hook($hook_name, $callback) {
    global $hooks;
    $hooks[$hook_name][] = $callback;
}

function execute_hook($hook_name, $params = []) {
    global $hooks;
    if (isset($hooks[$hook_name])) {
        foreach ($hooks[$hook_name] as $callback) {
            call_user_func_array($callback, $params);
        }
    }
}

// 使用示例
add_hook('before_save', function($data) {
    echo "Processing data before save: " . print_r($data, true);
});

$data = ['id' => 1, 'name' => 'Test'];
execute_hook('before_save', [$data]);

面向对象实现方式

class HookManager {
    private $hooks = [];

    public function add($hook_name, $callback) {
        $this->hooks[$hook_name][] = $callback;
    }

    public function execute($hook_name, $params = []) {
        if (isset($this->hooks[$hook_name])) {
            foreach ($this->hooks[$hook_name] as $callback) {
                call_user_func_array($callback, $params);
            }
        }
    }
}

// 使用示例
$hookManager = new HookManager();
$hookManager->add('after_login', function($user) {
    echo "User {$user} logged in successfully";
});

$hookManager->execute('after_login', ['admin']);

WordPress风格的钩子实现

class HookSystem {
    private static $actions = [];
    private static $filters = [];

    public static function add_action($hook, $callback, $priority = 10) {
        self::$actions[$hook][$priority][] = $callback;
    }

    public static function do_action($hook, $args = []) {
        if (isset(self::$actions[$hook])) {
            ksort(self::$actions[$hook]);
            foreach (self::$actions[$hook] as $priority => $callbacks) {
                foreach ($callbacks as $callback) {
                    call_user_func_array($callback, $args);
                }
            }
        }
    }

    public static function add_filter($hook, $callback, $priority = 10) {
        self::$filters[$hook][$priority][] = $callback;
    }

    public static function apply_filters($hook, $value, $args = []) {
        if (isset(self::$filters[$hook])) {
            ksort(self::$filters[$hook]);
            foreach (self::$filters[$hook] as $priority => $callbacks) {
                foreach ($callbacks as $callback) {
                    $value = call_user_func_array($callback, array_merge([$value], $args));
                }
            }
        }
        return $value;
    }
}

// 使用示例
HookSystem::add_filter('content_filter', function($content) {
    return strtoupper($content);
});

$content = "hello world";
$filtered = HookSystem::apply_filters('content_filter', $content);
echo $filtered; // 输出: HELLO WORLD

事件驱动实现

interface HookListener {
    public function handle($event);
}

class HookDispatcher {
    private $listeners = [];

    public function addListener($event_name, HookListener $listener) {
        $this->listeners[$event_name][] = $listener;
    }

    public function dispatch($event_name, $event) {
        if (isset($this->listeners[$event_name])) {
            foreach ($this->listeners[$event_name] as $listener) {
                $listener->handle($event);
            }
        }
    }
}

// 使用示例
class UserRegisteredListener implements HookListener {
    public function handle($event) {
        echo "User {$event['username']} registered with email {$event['email']}";
    }
}

$dispatcher = new HookDispatcher();
$dispatcher->addListener('user.registered', new UserRegisteredListener());

$event = ['username' => 'john', 'email' => 'john@example.com'];
$dispatcher->dispatch('user.registered', $event);

钩子实现注意事项

  • 优先考虑使用面向对象方式实现,更易于维护和扩展
  • 为钩子添加优先级支持,可以控制回调执行顺序
  • 考虑添加移除钩子的功能
  • 大型项目建议使用成熟的PHP事件系统如Symfony EventDispatcher

以上实现方式可根据项目需求选择或组合使用,简单的钩子系统可以使用函数数组方式,复杂的系统建议采用面向对象或事件驱动方式。

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

相关文章

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…