已扩展类之间的共享函数

时间:2014-09-14 10:40:15

标签: php oop

我希望整理一些我继承的代码。基本上我们有两个类(A + B),它们扩展了两个不同的类,它们以不同的方式执行各种操作,但A和B也共享一些函数。目前这些功能都是两者之间的复制和粘贴,显然我知道这是错误的。我希望看看它是否有解决方案,以便我只需要定义一次函数,以便A和B都可以使用它们。任何帮助都会很棒!

2 个答案:

答案 0 :(得分:2)

从php 5.4你可以使用Traits

以下是手动

的示例
<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>

答案 1 :(得分:1)

在一个理想的世界中,你真正想要的东西可能是多重继承,但PHP(或许多其他语言)不支持它,因为它比单继承复杂得多。

要考虑的另一种方法是安排代码,以便两个类最终都从一些共同的祖先继承,以便您可以将代码放在此处。然而,这可能并不总是可取的或实际的,特别是如果扩展的某些类来自不同的库而没有共享依赖。

您可以通过使用“组合”和“委派”而不是直接继承来更改某些类的祖先。基本思想是,不是B类扩展A类,而是将A类的实例存储为B类的属性;当调用类B的某些方法时,它们调用A实例的相应方法,而B的其他方法完全独立,并且可以从其他地方继承。 magic method __call可用于实现此功能,而无需事先知道每种可能的委托方法。

从PHP 5.4开始,有一种"horizontal code reuse" called Traits形式。特征有时被描述为“编译器辅助的复制和粘贴”,因为它们不代表使用它们的类之间的任何OOP关系,只是在一个地方编辑函数的方式。

如果这些功能是公开的,您可能需要declare the classes as implementing an Interface,这可以让其他代码检查一组方法是否可用,通常是使用instanceof运算符。这可以与Trait结合使用,其中包含 这些方法的实现细节。

相关问题