一、前言

最近有个需求,比如有A,B,C,D四个文件,原来的逻辑是,A继承B,C继承D。后来由于A和C的逻辑太像,既然如此的话,为什么不把A,C写一起呢,第一是方便维护,第二也是减少无用的代码,说干就干

二、首先使用trait特性

我们知道,php没有多继承这个特性,只能是多个子类共同继承一个父类,而不能一个子类继承多个父类。PHP 5.4中的traits,是新引入的特性,其实际的目的,是为了解决php的单继承问题,用于实现代码重用的方法。 Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。

php的Traits属性以及基本用法

这么看来trait是可用的,因此改为如下形式的:

// 把原来的D累改为trait特性
trait D{
//不能有构造函数
}
//A类继续继承B,不过引入了trait D
class A extends B{
use D;
}

这样一来,我们实例化A类,就可以同时用到BD的函数方法,实现了类似多继承的特性。但是,如果B类和D类有冲突呢,在代码比较多的情况下,逐行修改冲突的函数,修改成员变量是很不智的行为,因此放弃此方法。

三、定义接口

我们知道,php的接口是可以被多个类继承的,那么我们把BD都定义为接口,A类继承接口不就好了吗?说干就干。要注意接口的特性,接口中的方法只能有名字,不能有具体的方法体,而且被继承的话,要实现接口中所有的方法。

博主这里使用的是Yii2.0框架,直接定义接口如下:

interface B{
//这里是函数,只能有函数名,不能有方法体
}interface D{}class A implements B,D{}

这里注意,要把接口和A类写在同一个文件中,博主最开始是把接口都拿出来单独写,发现调用的时候一直提示找不到接口。写在同一个文件就好了。

缺点: 这样A文件会变得很大,而且可维护性变差,如果A还要继承其他的类,那是不是又要新增接口了?可维护行差

四、最终方案

在博主推翻自己的两个方案之后,灵光一闪才发现自己真的笨,陷入了误区。为什么一定要想办法实现A类继承BD类呢,为什么不能把A类当做父类,用B和D类继承A类就好了。

class A{
//父类
}class B extends A{
}
class D extends A{
}

这样简单明了,需要修改的代码也最少,可耻的匿了~

end

yii2.0框架中自定义接口,实现类的多继承相关推荐

  1. 教你在Yii2.0框架中如何创建自定义小部件

    本教程将帮助您创建自己的自定义小部件在 yii framework 2.0.部件是可重用的模块和用于视图. 创建一个小部件,需要继承 yii\base\Widget,覆盖重写 yii\base\Wid ...

  2. Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)

    Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略) 注:本文为旧文的markdown重制版 Cloudsim中VM调度策略类在DataCenter(或PowerDataCenter) ...

  3. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  4. php实现多条件查找分页,Yii2.0框架实现带分页的多条件搜索功能示例

    本文实例讲述了Yii2.0框架实现带分页的多条件搜索功能.分享给大家供大家参考,具体如下: 方法一 在控制器中 public function actionShow(){ $where['title' ...

  5. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

  6. Java 接口的定义、接口的成语、接口的实现、接口与类的多继承、JDK1.8后新增方法、使用接口的注意事项

    什么是接口? 接口是更加彻底的抽象,在JDK 1.8之前接口中只能是抽象方法和常量. 接口体现的是规范思想,实现接口的子类必须重写完接口的全部抽象方法. 接口的基本定义格式: 修饰符 interfac ...

  7. IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类

    IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类 查看当前类所有的父类 查看当前所有的子类 查看当前类所有的父类 1.找到当前类所在的位置,右键选择Diagrams,然后选择 ...

  8. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  9. 将SSM架构中原来关于springSecurity3.x版本的写法配迁移到SpringBoot2.0框架中出现的问题解决记...

    迁移过程中关于这个安全框架的问题很麻烦,springBoot自带的stater中的版本是5.0,原来系统有通过实现"org.springframework.security.authenti ...

最新文章

  1. Windows+Python 3.6环境下安装PyQt4
  2. 2015年10月15日学习html基础笔记
  3. webpack学习笔记--安装
  4. System.InvalidOperationException: The stream does not support reading
  5. R语言空间数据处理(part1)--基础数据操作与处理
  6. ACM思维题训练 Section A
  7. 【CodeForces - 438D】The Child and Sequence(线段树区间取模操作)
  8. key redis 遍历_快乐运维Redis大数据量查询与清理
  9. opencv 叠加两张图_OpenCV基础篇之图片叠加
  10. Python_pandas 两种主要的数据类型(Series、DataFrame)
  11. leetcode - 376. 摆动序列
  12. python迭代遍历目录下所以文件(Iterating through directories with Python)
  13. 如何使用a标签下载文件
  14. udhcpc遇到问题
  15. Mac版Charles免费安装及使用
  16. python什么意思g_python字符串%%g的格式是什么?
  17. linux otl mysql_Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)...
  18. 华为路由器 wifi网速慢解决办法
  19. 《Improving Cross-lingual Text Classification with Zero-shot Instance-Weighting》论文笔记
  20. html选课系统制作,校园选课系统的制作方法

热门文章

  1. php 静态类在worker,GatewayWorker的Events.php中调用Worker::runAll()出现异常
  2. jsoncontains mysql_Mysql5.7.9之后的JsonObject类型数据的匹配函数Json_Contains
  3. 【redis】缓存击穿、雪崩、穿透
  4. 车辆颜色识别学习笔记
  5. cv2.dnn读取模型报错
  6. No module named ‘sklearn.utils.linear_assignment_‘
  7. module ‘tensorflow‘ has no attribute ‘Tensor‘
  8. python已停止工作
  9. yolo v3学习笔记
  10. Python二维离散余弦变换图像压缩应用(基于OpenCV)