PHP框架开发中应采用Traits复用、抽象工厂封装、Composer发布库及模板方法固化流程。Traits横向注入日志等能力;抽象工厂确保缓存与锁共享客户端;Composer发布PSR-4规范库;模板方法定义ReportGenerator骨架,子类实现具体步骤。

在PHP框架开发中,重复编写数据库连接、日志记录、权限校验等逻辑,导致维护成本飙升、上线周期拉长。直接复制粘贴代码看似省事,实则让项目变成“补丁堆”,一个字段改错,八处接口报错。
用Traits横向复用行为
方法一:把通用功能抽成Trait,直接注入到任意类里
打开你的用户服务类,在class声明后第一行写use Logger, Validator, Cacheable;。
这三行代码就把日志、验证、缓存能力“拼装”进当前类,不需要继承任何父类。
【Traits不参与继承链,private方法不会被子类继承,但use后的public/protected方法可直接调用】
方法二:解决同名方法冲突
当两个Trait都定义了log(),PHP会报致命错误。此时用insteadof明确取舍:use LoggerA, LoggerB { LoggerB::log insteadof LoggerA; }。
如果还想保留LoggerA的log,加别名:LoggerA::log as logA。
用抽象工厂封装对象族
第一步:定义接口契约
先写CacheInterface和LockInterface,只声明get()、set()、acquire()等方法签名,不写实现。
立即学习“PHP免费学习笔记(深入)”;
第二步:实现配套对象
写RedisCache和RedisLock,确保它们共用同一个RedisClient实例——这是关键,否则缓存写入和锁校验可能跨连接失效。
第三步:创建工厂类
新建RedisCacheFactory,构造时传入$redisClient,createCache()和createLock()都用这个客户端初始化实例。
这一步做完,所有需要缓存+锁组合的地方,统一调用工厂,不再手动new两个对象。
用Composer发布公共库
把日志组件单独建Git仓库,目录结构为:src/Log/Logger.php,命名空间设为AppLibraryLog。
在composer.json里声明"autoload": {"psr-4": {"App\Library\Log\": "src/Log/"}}。
发布v1.2.0版本后,在微服务项目中执行composer require your-org/logger:v1.2.0即可引入。
这一步操作起来很简单,直接把文件拖进去就行。
注意:不要在公共库中硬编码数据库配置或环境路径,所有外部依赖必须通过构造函数注入。
用模板方法固化算法骨架
定义抽象类ReportGenerator,里面写好generate()模板方法:
它按顺序调用fetchData()→formatData()→export()三个抽象方法。
子类只需实现这三个空方法,不用操心执行顺序和异常兜底逻辑。
比如SalesReport和UserReport都继承它,各自专注查什么表、怎么格式化、导出成CSV还是PDF——80%的流程控制逻辑复用了,20%的业务差异由子类决定。



















