charescape/serialize-closure

一个可以用来序列化闭包(匿名函数)和任意对象的库。

3.8.0 2023-04-12 09:30 UTC

README

Tests Latest Stable Version Latest Unstable Version License

与原始版本相比的差异

  • 作为 opis/closure 包的替代品安装,使用相同的命名空间和类
 composer require charescape/serialize-closure

如果您的根 composer.json 中直接需要 opis/closure,您必须先删除它

composer remove opis/closure

向后不兼容的更改

1. 序列化格式和 SerializableClosure 类 API

TLDR: 只有在以下情况下您才会受到影响:

  • 使用了 JsonSerializableClosure
  • 使用 SerializableClosure::setSecretKey() 对闭包进行签名
  • 扩展了 SerializableClosureJsonSerializableClosure

PHP 8.1:Serializable 接口弃用 强制我们实现 __serialize(): array__unserialize(array $data): void 方法。

从 PHP 7.4 开始,当类实现了这些魔术方法时,将不再调用 Serializable::serialize(): stringSerialize::unserialize(): void。查看以下示例,了解在实现了 __serialize__unserialize 方法的情况下和没有实现的情况下输出如何 显示

这意味着我们只能构建我们希望 PHP 序列化为字符串的数据数组,但不能自己构建字符串以包含签名。这就是为什么我们不得不更改 JsonSerializableClosure 类和 SerializableClosure 的序列化格式,当签名验证启用时。

受影响时的行动要点

  1. 如果您已将序列化闭包保存在您的数据库、缓存或文件中,您将需要重新序列化它们。
  2. 如果您扩展了 SerializableClosureJsonSerializableClosure 类,您将需要审查您的代码并做出必要的更改。

序列化闭包

Opis Closure 是一个库,旨在通过提供包装器来克服 PHP 在闭包序列化方面的限制,使所有闭包可序列化。

库的主要功能

  • 序列化任何闭包
  • 序列化任意对象
  • 不使用 eval 进行闭包序列化或反序列化
  • 与任何支持闭包的 PHP 版本一起工作
  • 支持 PHP 7 语法
  • 处理所有在 use() 中引用/导入的变量,并自动包装所有引用/导入的闭包以进行适当的序列化
  • 处理递归闭包
  • 处理像 __FILE____DIR____LINE____NAMESPACE____CLASS____TRAIT____METHOD____FUNCTION__ 这样的魔法常量。
  • 自动解析闭包内部使用的所有类名、函数名和常量名
  • 使用 #trackme 指令跟踪闭包的驻留源
  • 简单且非常快的解析器
  • 可以捕获并适当处理在执行反序列化闭包时可能发生的任何错误或异常
  • 您可以无限次地序列化/反序列化任何闭包,即使是之前已反序列化的(这是因为未使用 eval() 进行反序列化)
  • 处理静态闭包
  • 支持加密签名闭包
  • 提供反射器,可让您了解序列化闭包的信息
  • 提供用于 SuperClosure 库的分析器
  • 自动检测闭包的作用域和/或绑定对象何时需要序列化,以便在反序列化后闭包能够工作

文档

本库的完整文档可以在这里找到。

许可证

Opis Closure 遵循MIT许可证(MIT)

要求

  • PHP ^5.4 || ^7.0 || ^8.0

安装

Opis Closure 可在 Packagist 上找到,并且可以通过使用 Composer 从命令行界面进行安装。

composer require charescape/serialize-closure

或者您可以直接在您的 composer.json 文件中将其作为依赖项引用

{
    "require": {
        "charescape/serialize-closure": "^3.8"
    }
}

从 2.x 迁移

如果您的项目需要支持 PHP 5.3,您可以继续使用 Opis Closure2.x 版本。否则,假设您没有使用已删除/重构的类或功能(请参阅变更日志),迁移到 3.x 版本仅仅是更新您的 composer.json 文件的问题。

语义版本控制

Opis Closure 遵循语义版本控制规范

任意对象序列化

我们添加此功能是为了能够支持闭包绑定对象的序列化。实现远未完美,要使其无瑕疵地工作非常困难。我们将努力改进这一点,但我们无法保证任何事情。因此,关于 Opis\Closure\serialize|unserialize 函数的建议是谨慎使用。