Home > Article > Backend Development > PHP multiple inheritance understanding
php Multiple inheritance is very confusing, and the ambiguity and Diamond of Death inheritance tree are small at both ends and large in the middle, so use traits instead (clear and clear, reuse code is achieved, and the flat method is clearer and solved Ambiguity (what method needs to be used or an error will be reported)
Last night I discussed with G a question about whether to use multiple inheritance. At that time, I was strongly opposed to it because multiple inheritance affected me. Extremely bad, I think this is something that should be despised. The main reason is that I think it is very easy to cause all kinds of confusion, both in programming and design, but I don't know much about its specifics. I have never used multiple inheritance before. This is because of the exam. I learned about this thing and threw it away immediately after the exam. In order to learn more about this thing, I went online to Baidu and found public comments about it. Advantages: Its advantages are obvious, simple, clear, and more conducive to reuse. Although single inheritance can also facilitate reuse, there may still be a lot of duplicate code. If multiple inheritance is used, the duplicate code will be reduced a lot. For example, Baidu Encyclopedia mentioned an example that a cat can inherit from both the mammal class and the cartoon class, so that there is no need to rewrite the properties and methods of the cartoon class. Disadvantages: The disadvantages are also obvious. The first is ambiguity. When there are methods with the same name in two base classes, you have to indicate which base class this method comes from when calling the subclass. This seems a bit troublesome, but fortunately, the compiler will remind you when you are confused. Secondly: if the class. A derives B and C, and B and C jointly derive D, and trouble arises. This kind of inheritance tree has a vivid name: Diamond Of Death (DOD: Diamond Of Death). "Death" literally is a very bad word, and it is true. A is the parent class of D, but there are two paths. This way of organizing data will have some unpredictable consequences. Apart from the ambiguity, I think Think about it, how many seemingly duplicate methods and how many data members with the same name are there in D! "Avoid the appearance of DOD at all costs. Unless, you think DOD is the most appropriate place to appear here, and make sure If you use virtual base classes (virtual inheritance), make sure you are fully aware of the details of each class, and make sure you know the side effects of virtual base classes (virtual inheritance)." Here is another vocabulary, vtable (in C++, I’m not sure if PHP has one, I haven’t found it on Baidu, but it should be there.) Vtable. Every class with virtual functions has such a thing. It actually records the function pointers of all virtual functions in this class. That is to say, it is the starting position of the function pointer array. For example, virtual void TheSecondFun() is recorded in the second element of the array. When an object instance of this class calls TheSecondFun, the second function pointer is taken out according to the corresponding relationship. To execute the function, this behavior is called late binding, which means that you only know what the called function looks like at runtime, instead of early binding that is determined during the compilation stage. Multiple inheritance can also make subclasses' vtables unusual. The single-inherited vtable just adds a new virtual function to the end of the parent class vtable, and the vtable of the subclass object contains the ordered parent class vtable. For multiple inheritance, the two parent classes may have completely different vtables. Therefore, it is absolutely impossible for the vtable of the subclass to contain the complete and ordered vtables of the two parent classes. The vtable of the subclass may contain two disconnected parent class vtables, so each parent class is forced to append a vtable, that is, a pointer is added to each parent class object. Multiple inheritance also brings some other problems: using parent class pointers to point to subclass objects becomes a complicated matter. You have to use dynamic_cast provided in C++ to perform the cast. As for dynamic_cast, it is also a troublesome guy. It converts during runtime rather than during compilation (because it cannot determine what type it wants to convert to during compilation). Therefore, in addition to causing some slight performance losses, it requires compilation. The compiler allows RTTI (Runtime Type Information, runtime type information), which requires the compiler to save runtime information of all classes. To summarize: In real life, some things often have the attributes of two or more things. In order to solve this problem, the concept of multiple inheritance is introduced. The advantage of multiple inheritance is that an object can call interfaces in multiple base classes. The disadvantage of multiple inheritance is that it is prone to upward ambiguity of inheritance and increases the complexity of the program. Suggestion: Use multiple inheritance judiciously. Use multiple inheritance judiciously. The last thing: existence is reasonable.
The above is the detailed content of PHP multiple inheritance understanding. For more information, please follow other related articles on the PHP Chinese website!