如何在不编辑第三方类的情况下将PHP方法添加到第三方类?

时间:2018-08-02 08:31:25

标签: php class inheritance traits

我正在使用具有“ Exchange”基类的第三方库。我想在不编辑基类的情况下将自己的公共方法添加到基类中(因此无法幸免升级)。我已经阅读了一些有关继承的内容,但只能想到以下三种实现方式:

  1. 直接将我的方法粘贴到“ Exchange”中
  2. 使用我的方法创建特征,然后将“ use MyMethod()”添加到“ Exchange”中
  3. 将“ Exchange”重命名为“ oldExchange”,然后创建一个新类,在其中使用我的方法“扩展Exchange”。

很明显,所有3个解决方案都需要编辑第三方代码,这意味着它在代码更新后将无法生存。

我是一个初学者,因此,如果您有解决方案,请提供一个冗长的答案,并在必要时提供基本代码。

谢谢。

编辑:根据答复,我意识到我已经遗漏了一个非常重要的约束。我的代码没有直接使用基类。我的代码使用扩展“ Exchange”的子类,它们也是同一第三方程序包的一部分,因此我必须编辑每个子类以使用扩展的Exchange。子类与父类都属于同一包,因此仍然存在更新覆盖的问题。

4 个答案:

答案 0 :(得分:1)

您应该继承Exchange并将您的公共/自定义代码添加到自定义类中。

例如:CustomExchage扩展了Exchange。

更新: 即使您需要使用第三方子类:解决方案也一样。从该子类(或通常从最特定的类)扩展

这可能会阻止您进行库更新。每次库的维护者更新代码时,都必须将自定义代码添加回Exchange类。考虑自动化部署:如果有更新,您可能不会意识到,更新可能会破坏应用程序的代码。

更强的扩展理由:您的自定义代码可能不属于基类(简单来说)。

答案 1 :(得分:1)

此答案取决于交换的结构(一切都可能是私有的,无法访问),但是您可以扩展该类。

class YourExchange extends Exchange {
    public function yourMethod() {}
}

然后您可以使用您的课程而不是Exchange。

再次,可能需要重复一些,这取决于最终的私有/受保护/公共或Exchange的内容。

一个示例是,如果Exchange具有private function fooBar(),您的新方法可能想要访问它,但由于private而不能。因此,说“哦,是的,只是扩大班级”可能并不像人们看到的那样直接。

Here is an 3v4l example

答案 2 :(得分:0)

最好的选择是第三种解决方案。您可以做的是创建扩展Exchange的基类,如下所示:

class MyExchange extends Exchange {
  public function myMethod () {

  }
}

然后将此类用作您自己的类的父级,如下所示:

class MyChildExchange extends MyExchange {
  //implement your method here
  public function myOtherMethod() {
    // call parent function
    $this->myMethod();
  }
}

答案 3 :(得分:-1)

PHP不允许在运行时向类添加方法,您应该编辑Exchange类或使自己的类继承自Exchange类。