已扩展类之间的共享函数


Shared functions between already extended classes

我正在整理我继承的一些代码。本质上,我们有两个类(A+B),它们从两个不同的类扩展而来,做各种不同的事情,然而A和B也共享一些函数。目前,函数是在两者之间复制粘贴的,显然我知道这是错误的。我想看看是否有解决方案,这样我只需要定义一次函数,这样a和B都可以使用这些函数。任何帮助都会很棒!

从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;
    /* ... */
}
?>

在理想的情况下,您真正想要的可能是多重继承,但PHP(或许多其他语言)不支持这种继承,因为它比单一继承复杂得多。

需要考虑的一种替代方案是安排代码,使两个类最终都继承自某个共同的祖先,这样您就可以将代码放在这里。然而,这可能并不总是可取或实用的,特别是如果扩展的某些类来自没有共享依赖关系的不同库。

您可以通过使用"composition"answers"delegate"而不是直接继承来更改某些类的祖先。其基本思想是,不是类B扩展类A,而是将类A的实例存储为类B的属性;当调用类B的某些方法时,它们调用A实例的相应方法,而B的其他方法是完全独立的,可以从其他地方继承。神奇的方法__call可以用于实现这一点,而不必事先知道每一个可能的委托方法。

从PHP5.4开始,有一种称为Traits的"水平代码重用"形式。特性有时被描述为"编译器辅助的复制和粘贴",因为它们不代表使用它们的类之间的任何OOP关系,只是在一个地方编辑函数的一种方式。

如果函数是公共的,那么您可能希望将类声明为实现接口,该接口允许其他代码检查一组方法是否可用,通常使用instanceof运算符。这可以与Trait结合使用,Trait包含如何实现这些方法的详细信息。