当前位置:首页 > 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 标准实现事件分发系统。

php实现hook

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 应用。

标签: phphook
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现增删改查

php实现增删改查

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

php实现表单

php实现表单

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

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php 实现排序

php 实现排序

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