2015-05-01 30 views
2

我試圖研究使用特徵的主題,而且我似乎無法得到明確的答案。瞭解PHP中的特徵與組成

博主ircmaxell建議他們might be "the new eval",我發現其他網站like this one,對他們說好的和壞的。我想確保在理解它們如何正確工作之前,在我的項目中實施它們之前。

例如: 我有10個不同的類,都擴展一個父,每個類有20個方法。在一半的類之間可能會有5種方法的重疊,所以將這5種方法抽象成特徵沒有意義嗎?特徵的要點是,這些方法可以應用於需要它們的類,而不會通過將它們放在父類中而將其他不需要它們的類弄髒,是正確的?

// Why repeat myself? 
class Parent { 
    public method1() {} 
    public method2() {} 
    public method3() {} 
} 

class Foo extends Parent { 
    public specificMethod1() {}  
    public specificMethod2() {}  
    public commonMethod1() {} 
} 

class Bar extends Parent { 
    public specificMethod1() {}  
    public specificMethod2() {} 
} 

class Baz extends Parent { 
    public specificMethod1() {}  
    public specificMethod2() {}  
    public commonMethod1() {} 
} 

// This way makes more sense 
trait commonMethod1 { 
    public commonMethod1() {} 
} 

class Foo extends Parent { 
    use commonMethod1; 
    public specificMethod1() {}  
    public specificMethod2() {} 
} 

class Bar extends Parent { 
    public specificMethod1() {}  
    public specificMethod2() {} 
} 

class Baz extends Parent { 
    use commonMethod1; 
    public specificMethod1() {}  
    public specificMethod2() {} 
} 
+0

在你的榜樣,不會告發」 t'specificMethod1'和'specificMethod2'在Parent中最好?他們對所有的孩子班都很普遍。 – halfer

+0

是否在特定情況下使用特質是主觀的。在這種情況下,三級層次結構可能更合適:父級可以擴展一次以包含「commonMethod1」,然後再次擴展爲「Foo」和「Baz」。 (儘管抽象的例子很難理解,因爲沒有明顯的關係,比如車輛,汽車和兩廂車)。 – halfer

+1

特徵是語言輔助複製粘貼。有很多情況下,他們是有用的。在你提到的情況下,他們做出*完美的感覺*。有些類需要這5種方法,有些則不需要,但它們都來自同一個「Parent」。一個特質允許你一次寫出5個方法,並將它們「注入」到需要它們的類中。 –

回答

3

是的你是對的。當你需要某種多繼承時,你可以從特性中獲得主要的好處,這是PHP不支持的。所以你可以組織一些應該在不同類中重用的代碼,它們沒有繼承關係。

例如:你可以有一類「其他」,即不涉及Partent,但你仍然需要功能「commonMethod1」,因此您可以使用相同的特質

class Other { 
use commonMethod1; 
}