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

一、前言

      最近有个需求,比如有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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值