hook php实现
PHP Hook 实现方法
Hook(钩子)是一种在特定事件发生时插入自定义代码的机制。PHP中可以通过多种方式实现Hook功能,以下为常见实现方法:
使用观察者模式
观察者模式是Hook的经典实现方式,通过注册监听器和触发事件实现:

class Hook {
private static $listeners = [];
public static function addListener($event, $callback) {
self::$listeners[$event][] = $callback;
}
public static function trigger($event, $data = null) {
if (isset(self::$listeners[$event])) {
foreach (self::$listeners[$event] as $callback) {
call_user_func($callback, $data);
}
}
}
}
// 注册Hook
Hook::addListener('user.login', function($user) {
echo "User {$user} logged in\n";
});
// 触发Hook
Hook::trigger('user.login', 'JohnDoe');
使用魔术方法实现
通过__call魔术方法可以实现动态Hook调用:
class Hookable {
private $hooks = [];
public function addHook($method, $callback) {
$this->hooks[$method][] = $callback;
}
public function __call($method, $args) {
if (isset($this->hooks[$method])) {
foreach ($this->hooks[$method] as $callback) {
call_user_func_array($callback, $args);
}
}
}
}
$obj = new Hookable();
$obj->addHook('beforeSave', function() {
echo "Before save logic\n";
});
$obj->beforeSave();
WordPress风格的Hook实现
WordPress的Hook系统是PHP中最成熟的实现之一:

class WPHook {
private static $actions = [];
private static $current_action = '';
public static function add_action($hook, $callback, $priority = 10) {
self::$actions[$hook][$priority][] = $callback;
}
public static function do_action($hook, $arg = '') {
if (!isset(self::$actions[$hook])) return;
self::$current_action = $hook;
ksort(self::$actions[$hook]);
foreach (self::$actions[$hook] as $priority => $callbacks) {
foreach ($callbacks as $callback) {
call_user_func($callback, $arg);
}
}
}
}
WPHook::add_action('init', function() {
echo "System initialized\n";
});
WPHook::do_action('init');
使用SplSubject和SplObserver接口
PHP标准库提供的观察者接口实现:
class HookEvent implements SplSubject {
private $observers;
private $data;
public function __construct() {
$this->observers = new SplObjectStorage();
}
public function attach(SplObserver $observer) {
$this->observers->attach($observer);
}
public function detach(SplObserver $observer) {
$this->observers->detach($observer);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setData($data) {
$this->data = $data;
}
public function getData() {
return $this->data;
}
}
class HookListener implements SplObserver {
public function update(SplSubject $subject) {
echo "Hook triggered with data: " . $subject->getData() . "\n";
}
}
$event = new HookEvent();
$event->attach(new HookListener());
$event->setData('test data');
$event->notify();
使用中间件模式
中间件模式可以看作是一种Hook实现方式:
class MiddlewareHook {
private $middlewares = [];
public function addMiddleware(callable $middleware) {
$this->middlewares[] = $middleware;
}
public function execute($input) {
$result = $input;
foreach ($this->middlewares as $middleware) {
$result = $middleware($result);
}
return $result;
}
}
$hook = new MiddlewareHook();
$hook->addMiddleware(function($data) {
return $data . " processed by middleware1";
});
$hook->addMiddleware(function($data) {
return $data . " processed by middleware2";
});
echo $hook->execute("Initial data");
以上方法可以根据具体需求选择使用,观察者模式适合事件驱动场景,中间件模式适合处理流程修改,WordPress风格适合插件系统开发。






