什么时候使用 PHP 中的特征合适?

When is it appropriate to use a trait in PHP?

我一直在阅读 PHP 的特征。具体来说,我看到了 this 篇文章。他们提供了一个涉及需要实现可共享接口的对象的示例。提出以下论点:

Does it make sense to duplicate the share() method in every class that implements the Shareable interface?

No.

Does it make sense to have an AbstractShare class that objects who implement the Shareable interface extend?

No.

Does it make sense to have the share() method implemented as part of an AbstractEntity class, but then blocked out for the Message object?

No.

Does it make sense to implement a ShareableTrait that fulfils the interface contract and can therefore be easily added to only objects that require it?

Yes!

第一点和第三点我能理解。但是第二个让我很困惑。拥有一个名为 AbstractShareable 的抽象 class 或包含共享某些功能的类似东西,然后从中扩展到底有什么问题?

接口专门用于创建可靠、良好的接口,独立于实现 class。含义:

function (Shareable $sharable) {
    $shareable->share();
}

您可以放心,由于您的接口声明,此代码将始终有效(任何传入的对象都具有 share() 方法)。

您可以使用 class 层次结构实现相同的目的;即,如果您需要某个 class,您可以确定它的所有子级也将具有与父级相同的方法。但是:这会在您的 classes 上施加严格的 class 层次结构。所有 classes 都必须扩展一个特定的基础 class。他们 只能 扩展那个特定的 class。例如,您不能对 AbstractSharableAbstractLoggable 使用 class 层次结构。这就是 class 层次结构解决方案太不灵活的原因。它只允许您实现一个 "trait"。或者您必须将所有各种 "traits" 混合到同一个基础 class 中。那么你就有了一个巨大的整体基础 class.

将特性分离到小的单独接口中可以使您的代码简单灵活。 Traits 提供了一个类似于接口规范的灵活实现。