php 实现钩子
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);
}
}
}
调用示例:
add_hook('before_save', function($data) {
echo "Processing data before save: " . $data;
});
trigger_hook('before_save', ['Sample Data']);
面向对象实现
通过类封装钩子逻辑,提高代码可维护性。
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);
}
}
}
}
使用示例:
$hookManager = new HookManager();
$hookManager->add('after_login', function($user) {
echo "User logged in: " . $user;
});
$hookManager->trigger('after_login', ['admin']);
使用观察者模式
观察者模式是更结构化的钩子实现方式。
interface Observer {
public function update($data);
}
class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function notify($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
class Logger implements Observer {
public function update($data) {
echo "Logging: " . $data;
}
}
使用示例:
$subject = new Subject();
$subject->attach(new Logger());
$subject->notify("Important event occurred");
使用事件分发器
对于复杂系统,可以使用事件分发器实现更灵活的钩子。
class EventDispatcher {
private $listeners = [];
public function addListener($event_name, $callback) {
$this->listeners[$event_name][] = $callback;
}
public function dispatch($event_name, $event = null) {
if (isset($this->listeners[$event_name])) {
foreach ($this->listeners[$event_name] as $listener) {
call_user_func($listener, $event);
}
}
}
}
使用示例:
$dispatcher = new EventDispatcher();
$dispatcher->addListener('user.created', function($user) {
echo "New user created: " . $user;
});
$dispatcher->dispatch('user.created', 'John Doe');
选择建议
- 简单项目可以使用函数式实现
- 中等规模项目推荐面向对象方式
- 大型项目建议使用观察者模式或事件分发器
- 框架项目可以考虑使用Symfony EventDispatcher等成熟组件
每种方法都有其适用场景,根据项目复杂度和团队习惯选择最合适的实现方式。







