当前位置:首页 > PHP

php 钩子 实现

2026-02-14 16:41:47PHP

PHP 钩子实现方法

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

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中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。 创…

php 链表实现

php 链表实现

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

php无法实现的

php无法实现的

PHP 的局限性 PHP 是一种广泛使用的服务器端脚本语言,主要用于 Web 开发。尽管功能强大,但在某些场景下存在局限性。 操作系统级开发 PHP 不适合编写操作系统内核或底层驱动程序。这类任务通…

php rsa 实现

php rsa 实现

PHP RSA 加密与解密实现 生成密钥对 使用 openssl_pkey_new 生成 RSA 密钥对,并通过 openssl_pkey_export 导出私钥。公钥可从密钥对中提取。 $conf…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…

php实现区块链

php实现区块链

PHP 实现区块链的基本步骤 PHP 可以用于实现一个简单的区块链系统,以下是关键步骤和代码示例: 区块类实现 创建一个 Block 类来表示区块链中的单个区块: class Block {…