当前位置:首页 > 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实现增删改查

php实现增删改查

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

php实现websocket

php实现websocket

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

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…