当前位置:首页 > PHP

hook php实现

2026-01-29 16:58:37PHP

PHP Hook 实现方法

Hook(钩子)是一种在特定事件发生时插入自定义代码的机制。PHP中可以通过多种方式实现Hook功能,以下为常见实现方法:

使用观察者模式

观察者模式是Hook的经典实现方式,通过注册监听器和触发事件实现:

hook php实现

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中最成熟的实现之一:

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风格适合插件系统开发。

标签: hookphp
分享给朋友:

相关文章

php实现socket

php实现socket

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

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现表单

php实现表单

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

php 实现登录

php 实现登录

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

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…