在软件开发中,我们经常需要为现有的对象或方法添加一些额外的功能,比如日志记录、性能监控、权限验证等。直接修改目标对象的源代码并不是一个好的做法,因为这样会增加代码的复杂性,并且违反"开闭原则"。
这时,拦截器模式就派上用场了。拦截器模式是一种非常有用的设计模式,它允许我们在不修改目标对象的情况下,对其进行功能增强或行为修改。
在本文中,我们将会实现一个简单的 PHP 拦截器,并演示如何使用它来记录方法调用日志。
拦截器的实现
首先,我们定义一个 InterceptorHandler
类,它负责管理目标对象和拦截器:
class InterceptorHandler
{
private $target;
private $interceptors = [];
public function __construct($target)
{
$this->target = $target;
}
public function addInterceptor($interceptor)
{
$this->interceptors[] = $interceptor;
}
public function __call($method, $arguments)
{
// 先执行拦截器
foreach ($this->interceptors as $interceptor) {
if ($interceptor->before($method, $arguments)) {
return $interceptor->around($method, $arguments, function () use ($method, $arguments) {
return call_user_func_array