PHP中无原生装饰器语法,但可通过实现统一接口、组合被装饰对象来模拟装饰器模式,支持链式调用与多层增强,核心是动态扩展行为而不修改原类。

PHP 装饰器模式实现面试题

PHP 中没有原生装饰器语法(如 Python 的 @decorator),但可以通过面向对象方式模拟装饰器模式,核心是「动态扩展对象行为,不修改原有类」。面试中常考的是手写一个可链式调用、支持多层增强的装饰器结构。

装饰器模式的本质与 PHP 实现要点

装饰器模式属于结构型设计模式,关键在于:装饰器类和被装饰类实现同一接口,装饰器内部持有被装饰对象的引用,并在方法调用前后插入逻辑。

手写可链式装饰器的典型代码结构

以下是一个简洁可用的面试级实现,支持多层包装:

// 接口
interface Processor {
    public function handle(string $data): string;
}

// 原始处理器
class TextProcessor implements Processor {
    public function handle(string $data): string {
        return trim($data);
    }
}

// 日志装饰器
class LoggingDecorator implements Processor {
    private Processor $wrapped;
    public function __construct(Processor $wrapped) {
        $this->wrapped = $wrapped;
    }
    public function handle(string $data): string {
        echo "[LOG] Processing: " . $data . "\n";
        return $this->wrapped->handle($data);
    }
}

// 大写装饰器
class UppercaseDecorator implements Processor {
    private Processor $wrapped;
    public function __construct(Processor $wrapped) {
        $this->wrapped = $wrapped;
    }
    public function handle(string $data): string {
        $result = $this->wrapped->handle($data);
        return strtoupper($result);
    }
}

// 使用示例
$processor = new TextProcessor();
$processor = new LoggingDecorator($processor);
$processor = new UppercaseDecorator($processor);
echo $processor->handle("  hello world  "); // 输出:[LOG] Processing:   hello world  \nHELLO WORLD

面试高频追问与应对建议

面试官常围绕灵活性、性能、边界场景提问:

避免踩坑的实战细节

写错容易暴露基础薄弱:

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。