itrocks / build
扩展您的PHP类:添加接口和特性或用子类替换
Requires
- php: >=8.2
- itrocks/class-use: dev-master
- itrocks/extend: dev-master
This package is auto-updated.
Last update: 2024-09-17 11:15:10 UTC
README
这个 it.rocks 库允许您静态地扩展您的 PHP 类:在实例化时添加接口和特性或用子类替换它们。这不仅仅是模拟,它的目的是让您能够创建高度可配置的应用程序,根据部署环境,激活或禁用类功能。
它被设计得非常简单,可以应用于任何 PHP 项目,并且执行速度快。
有了它,您不需要为依赖注入准备您的代码。目标是使您的代码应用尽可能简单,使用任何 PHP 的工作方式,而不嵌入依赖注入设计模式实现的复杂性。
限制:这是关于扩展基类功能,而不是完全使依赖实现解耦。这个工具旨在将开放/关闭原则(SOLID 中的 O,见SOLID)应用于需要模块化和带或不带某些模块部署的项目。
先决条件
- 这仅在 PHP 8.2 上工作。我想充分利用当前 PHP 版本的功能。
在 Debian/Ubuntu/Mint 系统上安装 PHP 8.2: https://php.watch/articles/install-php82-ubuntu-debian。
开发进度
这个库目前处于开发阶段。它将遵循 it.rocks Builder 模块规范,以泛化其工作方式,使其可用于任何 PHP 项目,即使是非 it.rocks 的项目,并应用于供应商库。
- ,以便在非 it.rocks 的项目中使用
- 。
目前没有任何功能,但很快就会到来。
工作原理
- 您将类构建表写入配置数组:类 => 子类或类 => 添加的接口和特性。
- 您的特性可以嵌入关于可继承性的规则:如果您需要某些特性在比其他特性更高的类级别上,因为它们扩展了其功能,您将使用 #Extend 属性来描述这个层次规则。
- 您的项目必须有一个 "更新" 阶段:一个在每次修改 PHP 文件时都会运行的进程。
- 在这个阶段,构建器使用 itrocks/class-use 扫描所有类依赖项。
- 使用类替换表,构建器准备动态构建替换类的实现。
- 在您的应用程序或供应商使用类的任何地方,类名都会被替换为构建类的引用。修改直接在标记树和标记为写入的文件中完成。
- 修改后的 PHP 文件将写入缓存目录。
- 要使用修改后的 PHP 文件而不是原始文件,应用 PHP 文件输入过滤器。它允许您调试应用程序并获取指向原始 PHP 文件的错误消息,但实际执行的代码来自缓存的修改后的 PHP 脚本。
这使得它在执行时间上非常快:当您运行脚本时,不需要执行比必要的更多的代码来实例化您构建的类,而不是原始类。您可以使用最简单的方式使用 PHP 面向对象编程:当不需要时不需要接口,并且您可以使用这个库将依赖项注入到任何现有的类或特性中,而无需为原始代码准备。
示例
考虑这个类
class Car { int $engine_power = 100; function getMaxSpeed() : int { return round($this->engine_power * 1.5); } }
您创建了另一个模块,该模块在项目的部署阶段可选,用于管理案例的重量及其对最大速度的影响。
#[Extend(Car::class)] trait Has_Weight { int $weight = 500; function getMaxSpeed() : int { return round(parent::getMaxSpeed() / ($this->weight / 400)); } }
您的部署配置文件之一描述了您如何“改进”您的汽车,仅适用于需要添加此代码的最终应用程序。
$config['build'] = [ Car::class => [Has_Weight::class] ];
然后,当您的源代码简单地实例化一辆汽车并获取其最大速度信息时,您不需要做任何更改:itrocks/build 将将替换放入内部缓存文件并实例化新的替换类。
$car = new Car; echo "My car maximum speed is " . $car->getMaxSpeed() . "\n";
将真正执行的代码将是创建一个新的替换类,并将所有对原始类名的引用替换为新的类名。
内部添加的代码
class B\Car { use Has_Weight; }
用于您程序的内部替换代码,将被执行
$car = new B\Car; echo "My Car maximum speed is " . $car->getMaxSpeed() . "\n";
已知潜在问题
- 缺少重建消失的缓存文件(配置未更改)。
- 缺少重建已更改任何源或组合文件的配置。
- 缺少在停止构建类/特质时清除缓存文件。
已知限制
这些用例目前已知无法正常工作。可能以后会得到解决。
- 使用扩展另一个特质的额外特质构建特质将不会按预期工作:如果有任何方法冲突,则将崩溃。使用 extends 扩展的特质仅适用于类。