PHP高级功能类存在时如何优先调用替代类避免大量if判断
解决方案
核心思路是用类继承+简单工厂组合实现,全程只需要做一次开关判断,后续业务代码不需要任何分支判断,也不需要维护多个实例变量。
第一步:修正类继承关系
你当前的高级类B没有继承基类A,所以无法复用基类里的通用方法,首先调整类定义:高级类继承基类,仅重写属于高级功能的方法即可,所有通用方法直接复用基类实现。
// 基类:存放所有场景通用的基础逻辑 class A { public function Testclass() { return 'in base class<br>'; } public function SomeBaseCode() { // 通用常驻逻辑,高级类不需要重写,会自动继承 return 'run base common logic<br>'; } } // 高级类:继承基类,仅覆盖需要差异化实现的高级功能方法 class B extends A { public function Testclass() { return 'in advanced class<br>'; } }
第二步:用工厂封装实例化逻辑
把advanced_enabled的判断逻辑收敛到一个统一的工厂方法里,全局只做一次判断,统一返回基类类型的实例——因为高级类继承自基类,完全符合里氏替换原则,调用方不需要感知当前拿到的是基类实例还是高级类实例。
/** * 统一获取业务实例 * @return A 基类或继承自基类的高级类实例 */ function getBusinessInstance(): A { // 仅在这里做一次开关和类存在性判断 if (advanced_enabled && class_exists(B::class)) { return new B(); } return new A(); }
第三步:业务代码无感知调用
后续所有业务代码只需要通过工厂拿一次实例,全程用同一个变量调用方法即可,不需要写任何if判断,也不需要区分实例类型:
// 全局统一拿实例,不需要关心当前是基础版还是高级版 $service = getBusinessInstance(); // 调用方式完全一致:高级模式下自动调用B的实现,基础模式自动调用A的实现 echo $service->Testclass(); // 通用方法不管什么模式都直接调用基类实现,不需要额外处理 echo $service->SomeBaseCode();
方案优势
- 开关判断逻辑全局仅存在1处,业务代码零分支判断,不需要维护多个实例变量,后续调整判断规则只需要修改工厂方法
- 通用逻辑全部沉淀在基类,高级类只需要编写差异化的高级功能代码,没有重复冗余代码
- 后续如果新增更多版本(比如企业版类C),只需要新增继承A的对应类、在工厂里加对应判断即可,现有业务代码完全不需要改动
- 符合面向对象开闭原则:对扩展开放,对修改关闭
内容的提问来源于stack exchange,提问作者user3052443
相关产品推荐
相关产品推荐

