itrocks/build

扩展您的PHP类:添加接口和特性或用子类替换

dev-master 2023-05-17 08:36 UTC

This package is auto-updated.

Last update: 2024-09-17 11:15:10 UTC


README

这个 it.rocks 库允许您静态地扩展您的 PHP 类:在实例化时添加接口和特性或用子类替换它们。这不仅仅是模拟,它的目的是让您能够创建高度可配置的应用程序,根据部署环境,激活或禁用类功能。

它被设计得非常简单,可以应用于任何 PHP 项目,并且执行速度快。

有了它,您不需要为依赖注入准备您的代码。目标是使您的代码应用尽可能简单,使用任何 PHP 的工作方式,而不嵌入依赖注入设计模式实现的复杂性。

限制:这是关于扩展基类功能,而不是完全使依赖实现解耦。这个工具旨在将开放/关闭原则(SOLID 中的 O,见SOLID)应用于需要模块化和带或不带某些模块部署的项目。

先决条件

开发进度

这个库目前处于开发阶段。它将遵循 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 扩展的特质仅适用于类。