【问题标题】:Transparent parent classes to extend base class vs "normal" extension of a base class扩展基类的透明父类与基类的“正常”扩展
【发布时间】:2016-06-09 07:20:15
【问题描述】:

我是 Oxid 框架的新手,它广泛使用透明父类来扩展基类。我没有看到这种技术的优势。所以我很好奇,这是一种模式吗?好处在哪里?

干杯, 凯瑟琳

示例代码:

\\ a class by the framework I like to extend
class A { ... }

比Framework扩展这个类的常用方式:

class B extend class B_parent

其中 B_parent 是框架通过配置文件创建的类,如下所示:

'extend'    => array(
        'A'    => 'path_to/B')

【问题讨论】:

    标签: php design-patterns oxid


    【解决方案1】:

    这不是一个特定的已知设计模式,它是专门为 oxid 设计的功能。 Oxid 中的类不是用“new”而是由工厂实例化的,例如 oxnew("oxarticle")。如果 oxarticle 没有注册模块,则工厂只返回一个 oxarticle 的实例。

    当模块将“myOxarticle”注册为 oxarticle 的扩展时,oxnew("oxarticle") 将返回一个 myOxarticle 实例,而 myOxarticle 将从 oxarticle 扩展。这个类链是工厂搭建的。这是第一个好处,假设您使用了“myOxarticle extends oxarticle”,您将不得不更改所有使用 oxarticle 的地方,以便使用您的对象而不是 oxarticle。现在有了透明的类链,工厂处理了这个,你的新功能现在可以在任何使用 oxarticle 对象的地方使用。调用 oxnew("oxarticle") 的地方不需要知道你的新对象。

    第二个优点是当有多个模块扩展同一个 Oxid 类,甚至是同一个方法时。工厂在后台构建类链,oxnew("oxarticle") 返回链中最后一个类的实例。如果扩展一个类,则在所有方法中调用父方法是一种很好的做法。所以如果基类的某个方法被调用,所有模块类的每个方法都会被执行,并且每个模块不需要知道其他模块。

    另一种扩展功能的方法是使用钩子或过滤器。钩子的缺点是它们必须内置到每个可能扩展的方法中,即使这样,氧化方式也更加灵活。

    可能有一些原因会阻止您在类方法中调用父方法,例如,如果父方法做了您不希望发生的事情。在这种情况下,这破坏了模块之间的独立性,只有在没有其他方法的情况下才应该这样做。

    如果您不想更改现有行为,而是想创建自己的仅由模块使用的类,例如新的页面控制器,则元数据中有“文件”数组,它只注册您的自动加载器中的类,在这种情况下,您将使用例如“mycontroller extends oxubase”而不是“mycontroller extends mycontroller_parent”。

    【讨论】:

      【解决方案2】:

      OXID 使用这种方式处理类扩展,因为它可以为同一个类组合多个扩展而不破坏继承链。

      例如你有两个扩展同一个类“start”的模块(用于商店起始页) 如果两个模块都使用class myStart extends startmyOtherStart extends start,则它们将仅继承自start,并且不具有其他扩展的附加功能或更改。所以你不能同时使用这两个模块。

      通过使用class myStart extends myStart_parentmyOtherStart extends myOtherStart _parent 以及 metadata.php 中的扩展映射,OXID 可以动态地将同一类的所有更改合并到一个类中。
      1) start 是父类
      2) myStart 将应用于start
      3) myOtherStart 将应用于myStart
      在这个继承链的末端,你会得到一个具有所有类扩展功能的类

      干杯!

      【讨论】:

      • 嗨马拉,谢谢你的回复。需要明确的是:生成的父类在我想用我自己的实现替换 base classes 以及我想通过不同的模块继承 的情况下很重要。有了这个,我可以配置继承,而不是接触类中的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多