当前位置:首页 > PHP

php实现hook

2026-02-14 18:07:02PHP

PHP 实现 Hook 的方法

Hook(钩子)是一种编程技术,允许在特定事件发生时插入自定义代码。PHP 中可以通过以下几种方式实现 Hook。

使用观察者模式

观察者模式是一种常见的事件处理机制,适用于 Hook 实现。

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

class HookManager {
    private $listeners = [];

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

    public function trigger($event, $data = null) {
        if (isset($this->listeners[$event])) {
            foreach ($this->listeners[$event] as $listener) {
                $listener->handle($data);
            }
        }
    }
}

// 示例使用
class LogListener implements HookListener {
    public function handle($data) {
        echo "Log: " . $data . "\n";
    }
}

$hookManager = new HookManager();
$hookManager->addListener('before_save', new LogListener());
$hookManager->trigger('before_save', 'Data is about to be saved');

使用函数回调

通过回调函数实现简单的 Hook 机制。

class HookSystem {
    private $hooks = [];

    public function addHook($hookName, callable $callback) {
        $this->hooks[$hookName][] = $callback;
    }

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

// 示例使用
$hookSystem = new HookSystem();
$hookSystem->addHook('init', function() {
    echo "System initialized\n";
});
$hookSystem->runHook('init');

WordPress 风格的 Hook

WordPress 提供了成熟的 Hook 机制(动作和过滤器),可以借鉴其实现方式。

class WPHook {
    private $actions = [];
    private $filters = [];

    public function addAction($hook, $callback, $priority = 10) {
        $this->actions[$hook][$priority][] = $callback;
    }

    public function doAction($hook, ...$args) {
        if (isset($this->actions[$hook])) {
            ksort($this->actions[$hook]);
            foreach ($this->actions[$hook] as $callbacks) {
                foreach ($callbacks as $callback) {
                    call_user_func_array($callback, $args);
                }
            }
        }
    }

    public function addFilter($hook, $callback, $priority = 10) {
        $this->filters[$hook][$priority][] = $callback;
    }

    public function applyFilters($hook, $value, ...$args) {
        if (isset($this->filters[$hook])) {
            ksort($this->filters[$hook]);
            foreach ($this->filters[$hook] as $callbacks) {
                foreach ($callbacks as $callback) {
                    $value = call_user_func_array($callback, array_merge([$value], $args));
                }
            }
        }
        return $value;
    }
}

// 示例使用
$wpHook = new WPHook();
$wpHook->addAction('init', function() {
    echo "WordPress style init\n";
});
$wpHook->doAction('init');

使用 PHP 的魔术方法

通过 __call 魔术方法实现动态 Hook。

class DynamicHook {
    private $hooks = [];

    public function __call($name, $arguments) {
        if (strpos($name, 'hook_') === 0) {
            $hookName = substr($name, 5);
            $this->hooks[$hookName][] = $arguments[0];
        } elseif (strpos($name, 'trigger_') === 0) {
            $hookName = substr($name, 8);
            if (isset($this->hooks[$hookName])) {
                foreach ($this->hooks[$hookName] as $callback) {
                    call_user_func($callback);
                }
            }
        }
    }
}

// 示例使用
$dynamic = new DynamicHook();
$dynamic->hook_test(function() {
    echo "Dynamic hook triggered\n";
});
$dynamic->trigger_test();

使用 PSR-14 事件分发器

遵循 PSR-14 标准实现事件分发系统。

interface EventDispatcherInterface {
    public function dispatch(object $event);
}

class EventDispatcher implements EventDispatcherInterface {
    private $listeners = [];

    public function addListener(string $event, callable $listener) {
        $this->listeners[$event][] = $listener;
    }

    public function dispatch(object $event) {
        $eventName = get_class($event);
        if (isset($this->listeners[$eventName])) {
            foreach ($this->listeners[$eventName] as $listener) {
                $listener($event);
            }
        }
    }
}

// 示例使用
class UserRegisteredEvent {
    public $userId;
    public function __construct($userId) {
        $this->userId = $userId;
    }
}

$dispatcher = new EventDispatcher();
$dispatcher->addListener(UserRegisteredEvent::class, function(UserRegisteredEvent $event) {
    echo "User {$event->userId} registered\n";
});
$dispatcher->dispatch(new UserRegisteredEvent(123));

每种方法适用于不同场景,观察者模式适合复杂事件系统,函数回调适合简单场景,WordPress 风格适合插件开发,动态 Hook 提供灵活性,PSR-14 标准适合现代 PHP 应用。

php实现hook

标签: phphook
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现文件上传

php实现文件上传

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

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form actio…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE T…