使用PHP特征来模拟多重继承

时间:2016-12-17 23:18:22

标签: php inheritance multiple-inheritance traits

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

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

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中引入相同的变量。这样做会迫使我保持​​两个片段同步,这一点都不好。

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

这是什么特质应该有助于?有更合适的方法吗?

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,我最终引入了一个接口(框架使用的函数)作为IPage扩展的契约。此外,我对特征中的页面和表单具有相同的特定实现,然后又在框架类AbstractPageAbstractForm中使用。

上面提到的实现在框架内部,有一个简洁的设计,然后在我的应用程序中也可以使用它。对于应用程序,我引入了一个特性,它再次保存了页面和表单中相同的变量和函数,然后在AbstractBasePageAbstractBaseForm类中使用。

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