PHP如何不重复代码让Intermediate继承不同Lib生成对应Final类
实现方案
你可以通过Trait抽离公共逻辑的方式实现需求,完全不需要重复编写Intermediate、Final的业务代码,最终可以快速生成Final1、Final2两个类:
具体实现步骤
- 先把Intermediate、Final类的公共逻辑抽成独立的Trait,不和固定父类绑定
- 分别定义继承Lib1、Lib2的中间层类,导入Intermediate逻辑的Trait
- 分别定义Final1、Final2类,对应继承不同的中间层类,导入Final逻辑的Trait
完整代码示例
<?php // 抽离Final类的公共逻辑 trait FinalTrait { public function final_level() { $this->low_level(); $this->inter_level(); } } // 抽离Intermediate类的公共逻辑 trait IntermediateTrait { public function inter_level() { $this->low_level(); } } // 原有Lib1、Lib2类(你原有代码的方法定义是抽象方法形式,按需补全实现即可) class Lib1 { public function low_level() { // Lib1对应的方法实现 } public function low_level2() { // Lib1对应的方法实现 } } class Lib2 { public function low_level() { // Lib2对应的方法实现 } public function low_level2() { // Lib2对应的方法实现 } } // 生成绑定Lib1的Final1类 class Intermediate1 extends Lib1 { use IntermediateTrait; } class Final1 extends Intermediate1 { use FinalTrait; } // 生成绑定Lib2的Final2类 class Intermediate2 extends Lib2 { use IntermediateTrait; } class Final2 extends Intermediate2 { use FinalTrait; }
PHP7+精简可选方案
如果你连Intermediate1、Intermediate2的显式定义都不想写,可以直接用匿名类实现动态继承:
// 生成Final1实例的工厂方法 function makeFinal1() { $intermediate = new class extends Lib1 { use IntermediateTrait; }; return new class extends $intermediate { use FinalTrait; }; } // 生成Final2实例的工厂方法 function makeFinal2() { $intermediate = new class extends Lib2 { use IntermediateTrait; }; return new class extends $intermediate { use FinalTrait; }; }
后续如果需要调整Intermediate或者Final的逻辑,只需要修改对应Trait即可,所有关联类都会同步生效,无需修改多份重复代码。
内容的提问来源于stack exchange,提问作者SpiderWan
相关产品推荐
相关产品推荐

