透明父类扩展基类与基类

时间:2016-06-09 07:20:16

标签: php design-patterns oxid

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

干杯, 席

示例代码:

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

比框架扩展此类的常用方法:

class B extend class B_parent

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

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

2 个答案:

答案 0 :(得分:2)

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

e.g。你有两个扩展同一类的模块" 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
在这个继承链的末尾,你得到一个具有所有类扩展的函数的单个类

喝彩!

答案 1 :(得分:2)

这不是特定的已知设计模式,它是一种特别针对氧化物的功能。 Oxid中的类不是用" new"来实例化的。而是通过工厂,例如oxnew(" oxarticle")。如果oxarticle没有注册模块,工厂只返回一个oxarticle实例。

当模块注册了" myOxarticle"作为oxarticle的延伸,oxnew(" oxarticle")将返回myOxarticle实例,myOxarticle将从oxarticle扩展。这个类链由工厂建造。这是第一个好处,想象你曾经使用过" myOxarticle延伸oxarticle",你必须改变所有使用oxarticle的地方,以便你的对象被用来代替oxarticle。现在有了透明的类链,工厂负责这个,你的新功能现在在使用oxarticle对象的地方使用。调用oxnew(" oxarticle")的地方不需要知道你的新对象。

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

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

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

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