php - 用 class_alias 覆盖类
问题描述
我知道这是一个非常糟糕的主意,但我的想法已经用完了,所以我想听听一些关于它的意见。
我正在开发一个 PHP 项目,该项目允许开发插件,以便其他开发人员可以添加自己的功能,这与数千个其他开源项目没有太大区别:
root
└── addons
└── addon-a
└── addon-b
└── addon-c
我必须在不更改原始文件或使用Composer PSR-4的情况下对已经制作的插件(比如说插件 A)进行一些更改。不幸的是,原作者没有遵循有助于完成这项任务的良好实践。这是插件 A 的样子:
结构
addon-a
└── main.php
└── classes
└── Foo.php
└── Bar.php
插件-a/main.php
include_once __DIR__ . '/classes/Foo.php';
function run() {
echo AddonA\Classes\Foo::returnTwo();
}
插件-a/classes/Foo.php
namespace AddonA\Classes
use AddonA\OtherFolder\FooBar
abstract class Foo {
public static function returnTwo() {
return 2;
}
public static function returnFooBar() {
return new FooBar();
}
}
我需要重写该returnTwo
函数并返回另一个值。在不更改其他文件的情况下,我能够做到这一点的唯一方法是通过class_alias方法,复制整个 Foo 类:
首先,我创建了另一个插件并使其在插件 A“运行”功能之前运行:
结构
new-addon-a
└── main.php
└── classes
└── Foo.php
新插件-a/main.php
function init() {
include_once __DIR__ . '/classes/Foo.php';
class_alias( 'NewAddonA\Classes\Foo', 'AddonA\Classes\Foo', true );
}
init();
new-addon-a/classes/Foo.php
namespace NewAddonA\Classes
use AddonA\OtherFolder\FooBar // No changes to the previous "uses."
abstract class Foo {
public static function returnTwo() {
return 3;
}
public static function returnBar() {
return new AddonA\Classes\Bar(); // Here I had to change because the namespace has changed
}
}
现在,当 Addon A 执行函数run
时,这AddonA\Classes\Foo::returnTwo
将是我自己的类。
好吧,正如我之前所说,这很丑陋,因为我覆盖了整个类,所以我会丢失对 Foo 代码的任何更新。然而,这是我唯一的想法。您认为可以使用其他方法吗?
谢谢!
解决方案
推荐阅读
- git - 如何在 Visual Studio 2019 中创建 Bitbucket 拉取请求
- javascript - javascripting 哪个网站接受发布 javascript
- php - Mysql选择具有相同值列的行
- python - 我怎样才能把它放在一个循环中,在开始时尝试使用一个while循环,但我会得到错误的输出
- apache-spark - 在写入雪花之前是否必须将胶水动态帧转换为火花数据帧?
- wordpress - 用于 wordpress 日志的 logrotation
- java - 从二维数组或矩阵中删除重复项
- oracle - 如何在 Oracle ADW 中上传带有西里尔文的数据?
- c++ - 抛出错误异常:读取访问冲突
- macos - 在 MAC 上找不到 VScode 实时服务器扩展