[英]Why does PHP have abstract classes if you can use an interface and traits?
我認為在如何以及何時使用它們方面存在一些哲學上的差異。
你說 :
如果你專注於你自己的措辭,這是有道理的。
抽象類是在現實中定義的東西都是抽象的如汽車是一個抽象的東西,直到或者除非其物化在汽車或自行車的形式。 接口既不定義它也不定義特征。
接口補充了類繼承功能,其中一個類繼承自多個類(只有某些語言提供多重繼承,例如C / C ++)。 接口,如名稱所示,側重於INTERFACE,而不是實現它的類中接口方法的實現。 它使類PLUG&PLAYABLE所以每個人都應該遵循標准 。 如果您在OOP上進一步了解工廠和適配器模式,您將理解它。
特征具有未綁定到特定類的實現/功能。相反,它可以在不同的類中找到。 它就像遺傳基因一樣,在父母身上保持沉默,只出現在某些孩子身上。 或者是簡潔的選擇性繼承,但不限於單個類。 因此,它提供了一種更好的代碼重用方式
編輯接口+ Trait!=抽象類,因為當使用Trait繼承是selective
因為您選擇要使用的特定特征,而使用Abstract Class
繼承是強制性的或由父類決定您沒有自由!
這有點像說浮點數是否存在,為什么存在整數,它們都有自己的特定用途,但更重要的是看看PHP的歷史將會對此有所了解:
PHP最初是在沒有任何支持的情況下構建的,並且多年來越來越多地添加了PHP以擴展PHP的功能,因為我們進一步推動它(並且有爭議的游戲趕上其他基於OOP的語言)
2004年 - 介紹了抽象類和接口
2012年 - 引入了特征
那是一個8年的休息時間,在那個時候需要增加對實現接口的支持,因此特性誕生了
當您使用traits時,您只需要一個給定的類來實現某些方法。
您不會繼承任何屬性或方法,也不會強制該對象進入任何繼承樹。
因此,您可以使用相同的特征來擁有幾個完全不相關的類,只是為了保證這些類的任何對象都支持給定的方法。
這就是PHP如何着名的Mixins。 基本上,Mixin只是一個可以與其他幾個類共享共同特征的類。 Traits允許對類的方法強制執行該約束,而與這些類是否相互繼承的方式無關。
當你想要一個類來組合兩個父母的行為時,你可以使用特征來獲得相同的結果,而不必麻煩一些不需要的其他東西,而不是必須做多次繼承到愚蠢的點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.