了解 PHP 中的特征与组合

Understanding Traits vs Composition in PHP

我正在研究使用 traits 的主题,但我似乎无法得到明确的答案。

博主 ircmaxell 建议他们 might be "the new eval", and I found other sites like this one,说他们的好话和坏话。在我的项目中实施它们之前,我想确保我了解它们如何正确工作。

例如: 我有 10 个不同的 classes,它们都扩展了一个 Parent,每个 class 有 20 个方法。 class 的一半之间可能有 5 个方法的重叠,所以将这 5 个方法抽象为特征不是很有意义吗? traits 的要点是这些方法可以应用于需要它们的 classes,而不会通过将它们放在父级中而污染其他不需要它们的 classes,对吗?

// 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() {}
}

是的,你是对的。当您需要某种多重继承时,您可以从 traits 中获得主要好处,而 PHP 不支持这种多重继承。所以你可以组织一些应该在不同的 classes 中重用的代码,它们没有继承关系。

例如:你可以有一个与Partent无关的class "Other",但是你仍然需要函数"commonMethod1",所以你可以使用相同的特征

class Other {
use commonMethod1; 
}