PHP中的Traits有哪些可能的使用场景?

Tow*_*wer 6 php oop traits

可能重复:
php中的特征 - 任何现实世界的例子/最佳实践?

在什么样的情况下,人们会在PHP中使用Traits?我对此有一个非常好的总体想法,但我似乎无法想到在我编写的应用程序中使用它们的方法,但这可能是因为它当时不需要特征.

一种情况我已经意识到需要特征:

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

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

msg*_*com -4

Traits 解决的问题与 Java 通过接口解决的问题类似 - 如何在不在同一类层次结构中的类之间强制执行共同行为(如接口所表示的)。

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

Java 通过接口解决了这个问题——接口本质上是一个管理行为提供的契约,这样一个类的对象可以替换另一个类的对象,因为它承诺相同的行为——接口。但他们不必来自同一层次结构。

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

  • PHP 也有[接口](http://php.net/manual/en/language.oop5.interfaces.php),与特征分开......!如果你想进行同类比较,特征就像来自 Ruby 等语言的 mixins,或者来自 Self 等语言的特征。 (6认同)
  • 我认为接口与特征没有太大关系。 (3认同)