首頁  >  文章  >  後端開發  >  php多繼承理解

php多繼承理解

小云云
小云云原創
2018-03-22 13:01:272231瀏覽

php 多繼承的是很混亂的,二義性和Diamond of  Death  兩頭小中間大的繼承樹, 所以使用trait 替代(清晰明了, 實現了復用代碼,扁平化的方式更加清晰, 解決了二義性(需要執行使用什麼方法不然報錯)。極差的,認為這是一個應該讓人唾棄的。重來沒有用過多重繼承,這是因為考試的原因,了解過這個東西,考完了馬上就丟掉了。它的優點,是顯而易見的,簡單,清晰,更有利於復用。例如百度百科裡提到了一個例子,一隻貓,可以同時繼承於哺乳類和卡通類,這樣就不用再去重新寫卡通類的屬性和方法。兩個基底類別中有同名方法的時候,你必須在子類別的呼叫中指明此方法出自那個基底類別 這看起來有些麻煩,幸好在你迷糊的時候,編譯器會提醒你。 A衍生了B和C,而B和C共同衍生了D,麻煩就出現了。 Death」字面看這是個非常不好的單詞,事實也如此,A是D的父類,但是有兩條路徑。這樣的數據組織方式會有一些難以預料的後果。除去二義性不說,想想吧,D中有多少個看似重複的方法,有多少個名字相同的數據成員! 「 不惜一切代價,避免DOD的出現。除非,你認為DOD出現在這裡是最恰當不過的,而且,確保你你使用了虛基類(虛繼承),確保你對每個類別的細節都完全清楚,確保你知道虛基類(虛繼承)的副作用。 PHP有沒有不是很清楚,沒有百度到,不過應該有吧。就是說是函數指標數組的起始位置。去執行函數,這種行為叫晚綁定,也就是說在執行時才知道呼叫的函數是什麼樣子的,而不是在編譯階段就確定的早期綁定。多重繼承也會使得子類別的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn