php实现hook
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 应用。







