【问题标题】:php override vendor package class methodphp覆盖供应商包类方法
【发布时间】:2017-03-02 17:11:45
【问题描述】:

在供应商文件夹中更改通过 composer 安装的软件包的正确方法是什么。

A:将包目录复制到项目源中(不再被composer更改)并从那里使用。

B:扩展类。

我认为 B 是正确的方法,但我发现它有两个问题。 1. 扩展类可能与供应商目录中更新的基类不兼容。 (在“作曲家更新”之后) 2. 如何在类链中操作方法。

$classA = new ClassA();
$classB = $classA->getsomeOtherClassInstance();
$classB->methodToChange();

即我必须更改 A 类和 B 类以确保调用 B 的扩展版本。

【问题讨论】:

  • 在私有存储库中分叉,然后根据需要对其进行编辑,然后将其用作单独的包,这将防止在您想要更新时将包“重新覆盖”到原始包您的供应商。
  • @HassanAhmed 作为一个单独的包使用......你的意思是我会将它添加到作曲家并成为我自己的供应商,还是让它位于供应商文件夹之外的目录中。
  • 还有第三种方式:组合。

标签: php composer-php


【解决方案1】:
  1. 扩展类可能与供应商目录中更新的基类不兼容。 (在“作曲家更新”之后)

如果您在 composer.json 文件中选择正确的版本号,则该类应始终向后兼容。看看https://getcomposer.org/doc/articles/versions.md(请记住,这仅适用于承诺向后兼容的代码存储库,但大多数大牌都这样做。)

此外,如果您愿意,您可以选择一个具体版本,例如“3.7.7”,它会阻止 composer update 更新您的代码,将始终使用该版本。但最好做到以上。

  1. 如何在类链中向下操作方法。

如果它是私有方法,那么您不应该更改它,最好寻找它的调用者并覆盖该方法和类。另外,看看装饰器设计模式,它允许你动态地改变方法的行为。

【讨论】:

  • 它不是私有方法,它是公共的。也许我对类扩展的一些核心概念有误。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多