yii2.0框架中自定义接口,实现类的多继承
2019-05-27 23:32
525 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LJFPHP/article/details/90614178
一、前言
最近有个需求,比如有
A,B,C,D四个文件,原来的逻辑是,
A继承B,C继承D。后来由于A和C的逻辑太像,既然如此的话,为什么不把
A,C写一起呢,第一是方便维护,第二也是减少无用的代码,说干就干
二、首先使用trait特性
我们知道,
php没有多继承这个特性,只能是多个子类共同继承一个父类,而不能一个子类继承多个父类。
PHP 5.4中的traits,是新引入的特性,其实际的目的,是为了解决
php的单继承问题,用于实现代码重用的方法。
Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。
这么看来
trait是可用的,因此改为如下形式的:
// 把原来的D累改为trait特性 trait D{ //不能有构造函数 } //A类继续继承B,不过引入了trait D class A extends B{ use D; }
这样一来,我们实例化
A类,就可以同时用到
B和
D的函数方法,实现了类似多继承的特性。但是,如果B类和D类有冲突呢,在代码比较多的情况下,逐行修改冲突的函数,修改成员变量是很不智的行为,因此放弃此方法。
三、定义接口
我们知道,
php的接口是可以被多个类继承的,那么我们把
B和
D都定义为接口,
A类继承接口不就好了吗?说干就干。要注意接口的特性,接口中的方法只能有名字,不能有具体的方法体,而且被继承的话,要实现接口中所有的方法。
博主这里使用的是
Yii2.0框架,直接定义接口如下:
interface B{ //这里是函数,只能有函数名,不能有方法体 } interface D{ } class A implements B,D{ }
这里注意,要把接口和A类写在同一个文件中,博主最开始是把接口都拿出来单独写,发现调用的时候一直提示找不到接口。写在同一个文件就好了。
缺点: 这样
A文件会变得很大,而且可维护性变差,如果
A还要继承其他的类,那是不是又要新增接口了?可维护行差
四、最终方案
在博主推翻自己的两个方案之后,灵光一闪才发现自己真的笨,陷入了误区。为什么一定要想办法实现
A类继承
B和
D类呢,为什么不能把A类当做父类,用B和D类继承A类就好了。
class A{ //父类 } class B extends A{ } class D extends A{ }
这样简单明了,需要修改的代码也最少,可耻的匿了~
end
相关文章推荐
- Yii框架实现记录日志到自定义文件的方法
- 自定义链表集合,无实现任何接口,继承
- 为什么在集合框架中已经继承了抽象类还要实现接口
- YII框架实现自定义第三方扩展操作示例
- YIi2.0 中有没有一个方法是跟TP框架里的setInc和setDec相同的功能,实现 加 减
- QuickCSharp框架开发(15)------定义SqlDbAuthenticationProvider对象、继承IAuthenticationProvider接口、实现Authenticate方
- Java回顾:用一个Demo来说明继承抽象类和实现接口的简单框架模型
- Yii2.0框架实现带分页的多条件搜索功能示例
- spring data继承CrudRepository接口并自定义接口和实现
- Java之集合框架 常用接口的继承、实现关系图
- 自定义序列化器类继承serializers.ModelSerializer实现模型数据简化映射到json格式
- (转)Java中继承Thread类与实现Runnable接口的区别
- Volley框架解析(六)-----Cache接口及其默认实现类解析
- 实现Comparable接口对存放自定义对象列表(数组)进行排序
- Java中继承thread类与实现Runnable接口的区别
- Java中的接口interface实现、与继承extends机制。
- 利用Razor在ASP.NET MVC中的实现,自定义视图引擎框架(1)
- Glide框架使用及自定义缓存实现缓存
- 定制并发类(四)实现ThreadFactory接口生成自定义的线程
- 面向对象-多线程、继承Thread类和实现Runnable接口