簡體   English   中英

如果你可以使用接口和特性,為什么PHP有抽象類?

[英]Why does PHP have abstract classes if you can use an interface and traits?

今天早些時候,我正在研究PHP的抽象類接口特性

據我所知,一個抽象類說“任何使用我的東西都將使用這些方法和屬性”,接口說“任何使用我的東西都必須有這些方法和屬性”,並且特征說“任何使用我的東西也會有這些方法”和屬性“。

現在,我的問題是,如果在使用接口和特征時獲得等效的抽象類,為什么還有抽象類?

如果我錯了,界面和特征不等同於抽象類,你能解釋一下為什么不是這樣嗎?

我認為在如何以及何時使用它們方面存在一些哲學上的差異。

你說 :

  1. 抽象類:“使用我的任何東西將使用這些方法和屬性”
  2. 接口:“使用我的任何東西必須具有這些方法和屬性”
  3. 特征:“任何使用我的東西都會有這些方法和屬性”。

如果你專注於你自己的措辭,這是有道理的。

抽象類是在現實中定義的東西都是抽象的如汽車是一個抽象的東西,直到或者除非其物化在汽車或自行車的形式。 接口既不定義它也不定義特征。

接口補充了類繼承功能,其中一個類繼承自多個類(只有某些語言提供多重繼承,例如C / C ++)。 接口,如名稱所示,側重於INTERFACE,而不是實現它的類中接口方法的實現。 它使類PLUG&PLAYABLE所以每個人都應該遵循標准 如果您在OOP上進一步了解工廠和適配器模式,您將理解它。

特征具有未綁定到特定類的實現/功能。相反,它可以在不同的類中找到。 它就像遺傳基因一樣,在父母身上保持沉默,只出現在某些孩子身上。 或者是簡潔的選擇性繼承,但不限於單個類。 因此,它提供了一種更好的代碼重用方式

編輯接口+ Trait!=抽象類,因為當使用Trait繼承是selective因為您選擇要使用的特定特征,而使用Abstract Class繼承是強制性的或由父類決定您沒有自由!

這有點像說浮點數是否存在,為什么存在整數,它們都有自己的特定用途,但更重要的是看看PHP的歷史將會對此有所了解:

PHP最初是在沒有任何支持的情況下構建的,並且多年來越來越多地添加了PHP以擴展PHP的功能,因為我們進一步推動它(並且有爭議的游戲趕上其他基於OOP的語言)

PHP 5.0

2004年 - 介紹了抽象類和接口

PHP 5.4

2012年 - 引入了特征

那是一個8年的休息時間,在那個時候需要增加對實現接口的支持,因此特性誕生了

當您使用traits時,您只需要一個給定的類來實現某些方法。

您不會繼承任何屬性或方法,也不會強制該對象進入任何繼承樹。

因此,您可以使用相同的特征來擁有幾個完全不相關的類,只是為了保證這些類的任何對象都支持給定的方法。

這就是PHP如何着名的Mixins。 基本上,Mixin只是一個可以與其他幾個類共享共同特征的類。 Traits允許對類的方法強制執行該約束,而與這些類是否相互繼承的方式無關。

當你想要一個類來組合兩個父母的行為時,你可以使用特征來獲得相同的結果,而不必麻煩一些不需要的其他東西,而不是必須做多次繼承到愚蠢的點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM