PHP中Traits的可能使用场景是什么?

问题描述:

可能重复:
traits in php – any real world examples/best practices?PHP中Traits的可能使用场景是什么?

在什么样的情况将一个用性状的PHP?我对此有一个非常好的总体思路,但我似乎无法想象在我写的应用程序中使用它们的方式,但这可能是因为它当时不需要特征。

一种情况我已经意识到,需要性状:

  • 活动。不要让一个类实现观察者模式并让所有其他类继承它,只要让它成为一个特征并让类想要触发事件或订阅使用特征。例如,Yii框架通过在CComponent类中实现东西而不是使用Trait而做错了。

基本上可以在类之间共享的功能,但可能沿着多个类层次结构传播应该使用特征。还有哪些场景可以利用Traits而不是事件系统?

Traits地址的问题与Java地址接口的问题类似 - 如何在不在同一类层次结构中的类之间强制执行通用行为(由接口表示)。

对于仅具有继承性的C++等语言,对于需要相同行为的相同上下文中使用的两个不同类的两个对象,这两个类必须来自同一层次结构。这有时意味着创建相当人为的层次结构,只是为了允许来自不同类的对象在相同的上下文中使用。

Java通过接口解决了这个问题 - 一个接口本质上是一个管理提供行为的契约,以便一个类的对象可以替代一个单独的类的对象,因为它承诺了相同的行为 - 接口。但他们不一定来自同一个层级。

PHP Traits体现了这个想法。特质是一种界面,是一类包含的一组行为,因此它可以在需要该行为的上下文中使用。所以,任何Java接口示例都应该继承到PHP Traits示例。 PHP Traits与Java接口有点不同,因为Traits可以包含完整的函数定义,而Java接口只能包含声明(典型的PHP idiosyncrasy!)

+6

PHP也有[interfaces](http://php.net) /manual/en/language.oop5.interfaces.php),与性状分开......!如果你想将苹果与苹果进行比较,特征就像来自Ruby等语言的mixin,或者像Self这样的语言的特征。 – deceze 2012-02-29 08:16:02

+3

我不认为接口与特质有很大关系。 – Tower 2012-02-29 08:17:04

+0

我会在这里留下http://compsci.ca/v3/viewtopic.php?t=14785 – 2012-02-29 08:52:16