使用PHP traits模拟多重继承

Using PHP traits to simulate multiple inheritance

对于这个问题,我想介绍一下我目前的设计和使用特征的想法。我想知道我对 traits 的理解是否正确,我的问题是否可以通过不涉及它们的另一种设计来解决。

我的框架中当前的 class 层次结构如下所示:

interface IPage { /* ... */ }
interface IForm extends IPage { /* ... */ }
abstract class AbstractPage implements IPage { /* ... */ }
abstract class AbstractForm extends AbstractPage implements IForm { /* ... */ }

在我基于框架的应用程序中,我曾经有以下内容:

abstract class AbstractBasePage extends AbstractPage { /* ... */ }

因此,我可以为这个特定应用程序的所有页面添加更多内容,这对框架或其他应用程序来说并不常见。在我按照第一个片段中的指示实现页面和表单分离之前,这一直很有效。现在我得到了这样的结果:

abstract class AbstractBasePage extends AbstractPage { /* ... */ }
abstract class AbstractBaseForm extends AbstractForm { /* ... */ }

假设在一个应用程序中,每个页面和表单都应该有一个变量,指示模板中是否显示了一些特殊内容。我需要在 AbstractBasePageAbstractBaseForm 中引入相同的变量。这样做会迫使我保持​​两个片段同步,这一点都不好。

我正在考虑创建一个特性,将变量和函数公开给 classes,它们可以在相应的函数中引用。使用这样的特性至少可以减少代码重复,因为我可以引入一种可公开访问的方法,该方法被两个 classes 调用,但除此之外还有一个不错的抽象,不是吗?

这就是特质应该帮助的吗?有没有更合适的做法?

在这种特殊情况下,我最终引入了一个接口(具有框架使用的功能)作为由 IPage 扩展的合同。此外,我有一个特定的实现,该实现对于特征中的页面和表单是相同的,然后又在框架 classes AbstractPageAbstractForm.

中使用

提到的实现是在框架本身内部进行的,以具有简洁的设计,然后在我的应用程序中也使用它来做到这一点。对于应用程序,我引入了一个特征,它再次保存在页面和表单中相同的变量和函数,然后在 AbstractBasePageAbstractBaseForm classes.

对于这种情况,我需要一个本质上是语言辅助的复制和粘贴功能,因为我想添加一些使用继承不容易完成但可以引入 classes 的东西它们属于不同的 class 层次结构。因此我决定使用特征。