欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php多继承理解

程序员文章站 2022-03-30 09:06:00
...
php 多继承的是很混乱的,二义性和Diamond of Death 两头小中间大的继承树, 所以使用trait 替代(清晰明了, 实现了复用代码,扁平化的方式 更加清晰, 解决了二义性(需要执行使用什么方法不然报错)。

昨天晚上和G讨论一个问题是否使用多重继承的问题,当时我是极力反对,因为多重继承在我的影响中式极差的,认为这是一个应该让人唾弃的。主要原因是我认为它十分容易引起各种各样的混乱,编程上的和设计上的。 但对于它具体情况并不是很了解,因为我重来没有用过多重继承,这是因为考试的原因,了解过这个东西,考完了马上就丢掉了。为了具体了解这个东西,我上网百度了下,找到了大众对于它的评论。 优点: 对于它的优点,是显而易见的,简单,清晰,更有利于复用。虽然单一继承也能有利于复用,但是还是有可能有很多的重复代码。如果使用了多重继承,重复代码会减少很多。比如百度百科里提到了一个例子,一只猫,可以同时继承于哺乳类和卡通类,这样就不用再去重新写卡通类的属性和方法。 缺点: 缺点也很明显,首先是二义性,两个基类中有同名方法的时候,你不得不在子类的调用中指明此方法出自那个基类。这看起来有些麻烦,幸好在你迷糊的时候,编译器会提醒你。其次:假如类A派生了B和C,而B和C共同派生了D,麻烦就出现了。这种中间大两头小的继承树有个形象的名字:钻石型继承树(DOD:Diamond Of Death)。从“Death”字面看这是个非常不好的单词,事实也如此,A是D的父类,但是有两条路径。这样的数据组织方式会有一些难以预料的后果。除去二义性不说,想想吧,D中有多少个看似重复的方法,有多少个名字相同的数据成员! “ 不惜一切代价,避免DOD的出现。除非,你认为DOD出现在这里是最恰当不过的,而且,确保你你使用了虚基类(虚继承),确保你对每个类的细节都完全清楚,确保你知道虚基类(虚继承)的副作用。 ” 这里再引进一个词汇,vtable(c++里的,PHP有没有不是很清楚,没有百度到,不过应该有吧。) Vtable   虚表。   每一个有虚函数的类都有这样一个东西。   它实际上记录了本类中所有虚函数的函数指针,也就是说是个函数指针数组的起始位置。   比如virtual void TheSecondFun()记录在数组的第二个元素,当一个该类的对象实例调用TheSecondFun时就根据对应关系把第二个函数指针取出来,再去执行该函数,这种行为叫晚绑定,也就是说在运行时才知道调用的函数是什么样子的,而不是在编译阶段就确定的早绑定。多重继承还会使得子类的vtable变得不同寻常。单继承的vtable只是在父类vtable的表尾加上新的虚函数,子类对象的vtable中包含了有序的父类vtable。而对于多重继承,两个父类可能有完全不同的vtable,因此,子类的vtable中绝对不可能包含完整的有序的两个父类的vtable。子类的vtable中可能包含了两块不相连的父类vtable,因此每个父类都*追加了一个vtable,也就是,每个父类的对象都添加了一个指针。 多重继承还会带来一些其他的问题:使用父类指针指向子类对象变成了一件复杂的事情。你不得不用到C++中提供的dynamic_cast来执行强制转换。至于dynamic_cast,也是个麻烦的家伙,它是在运行期间而非编译期间进行转换的(因为编译期间它不能确定到底要转向一个什么类型),因此除了会带来一些轻微的性能损失,它要求编译器允许RTTI(Runtime Type Information,运行时类型信息),也就是要求编译器保存所有类在运行时的信息。 总结下:实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,引入了多重继承的概念。 多重继承的优点是对象可以调用多个基类中的接口。 多重继承的缺点是容易出现继承向上的二义性,并且增加了程序的复杂度。 建议: 明智而谨慎地使用多重继承 Use multiple inheritance judiciously. 最后的最后:存在即合理吧。

以上就是php多继承理解的详细内容,更多请关注其它相关文章!

相关标签: php 理解 继承