memfinis / lazyjsonmapper
PHP 的先进、智能和自动面向对象的 JSON 容器。
Requires
- php: >=5.6
- corneltek/getoptionkit: 2.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.7.1
- phpunit/phpunit: 6.*
README
PHP 的先进、智能和自动面向对象的 JSON 容器。
实现一个高效、自动、面向对象且轻量级(内存方面)的 JSON 数据容器。它提供智能数据转换和解析,为您提供一个优美、可靠的 JSON 数据接口,无需担心任何繁琐的解析。
功能
-
为所有 JSON 数据提供完全面向对象的接口。
-
自动将复杂、嵌套的 JSON 数据结构映射到真实的 PHP 对象上,完全支持嵌套对象和多级数组。
-
针对非常高的性能和非常低的内存使用进行了极致优化。远低于人们过去使用的其他 PHP JSON 映射器。
例如,通常的 PHP 对象具有手动定义的
$properties,这正是其他 JSON 映射器所使用的,即使该属性不在 JSON 数据中(是NULL),也会为每个属性消耗内存。而我们的系统对于当前对象 JSON 数据中不存在的任何属性,将占用零字节 RAM !! -
自动提供“直接虚拟属性”,让您可以像操作常规对象属性一样与 JSON 数据交互,例如
echo $item->some_value和$item->some_value = 'foo'。可以通过选项禁用虚拟属性。
-
自动提供面向对象的“虚拟函数”,让您可以通过函数如
$item->getSomeValue()和$item->setSomeValue('foo')以完全面向对象的方式与数据交互。我们支持大量不同的函数来操作 JSON 数据,您可以通过简单地运行$item->printPropertyDescriptions()来查看所有属性的所有可用函数名称列表。可以通过选项禁用虚拟函数。
-
包含
LazyDoctor工具,该工具可以自动记录所有基于LazyJsonMapper的类,使其虚拟属性和函数对您的 IDE 和各种智能代码分析工具完全可见。它还通过编译所有类属性映射来执行类诊断,这意味着如果此工具运行成功,您可以100% 确定,您的所有映射都是有效的(可编译的)。 -
我们提供了一个完整的内部 API,您的子类可以使用它来与 JSON 容器内部的数据交互。这允许您轻松地覆盖自动函数或为您的对象创建额外的函数。要覆盖核心函数,只需在您的对象上定义一个具有完全相同名称的函数,并使其执行您想要的任何操作。
以下是一些函数覆盖的示例
public function getFoo() { // try to read property, and handle a special "current_time" value. $value = $this->_getProperty('foo'); if ($value === 'current_time') { return time(); } return $value; } public function setFoo( $value) { // if they try to set value to "md5", we use a special value instead if ($value === 'md5') { $value = md5(time()); } return $this->_setProperty('foo', $value); }
-
所有映射/数据转换都是“懒加载”完成的,按每个属性进行。当您访问属性时,该特定属性会映射/转换为类属性映射中定义的正确类型。无需浪费任何时间和内存来转换您从未接触过的属性。
-
强类型系统。类属性映射控制确切的类型和数组深度。您可以完全信任获取/设置的数据将与您的规范匹配。不匹配规范的不合法数据是不可能的。
-
高级设置系统。所有设置都可以通过PHP类常量轻松配置,这意味着您的类设置是无状态的(不需要任何特殊的“设置/映射对象”来跟踪设置),并且所有设置都是不可变的常量(这意味着它们是可靠的,并且在运行时永远不会改变,因此您可以完全信任类将始终按照其代码中的定义行为)。
如果您希望对所有类以相同的方式覆盖多个核心设置,那么只需创建一个
LazyJsonMapper的子类,并在该子类上配置所有设置,然后从您重新配置的子类继承所有其他类! -
世界上最先进的映射定义系统。您的类属性映射以简单的PHPdoc样式格式定义,支持多级数组(如
int[][]表示“整数数组的数组”),相对类型(因此您可以映射属性到与类属性映射命名空间相关的类/对象),父类继承(您的所有父extends继承层次结构的映射都将包含在最终的属性映射中)以及多重继承(您可以将无限数量的其他映射“导入”到您的类中,而这些映射不来自您自己的父extends继承层次结构)。 -
由于我们的属性映射编译器效率很高,从父类继承属性或从其他类导入属性是零成本操作。所以请随意导入您需要的所有内容。您甚至可以使用此系统创建可导入的类,这些类仅包含“共享属性”的“集合”,然后将这些属性导入到其他类中。
-
类属性映射在运行时为每个类编译一次,即在第一次使用该类时。编译过程完全验证并编译所有属性定义、所有父映射、所有继承映射以及所有您链接属性到的类的映射。
如果由于映射中的错误编写而导致任何编译问题,您将详细看到确切的问题。
在成功的情况下,编译和验证后的映射以极低的内存效率格式存储在全局缓存中,该缓存由您的整个PHP运行时共享,这意味着您的代码或任何其他访问相同类的库中的任何内容都将共享这些类的缓存编译,以实现最大的内存效率。
-
您还可以访问未在类属性映射中定义的JSON属性。在这种情况下,它们被视为未定义和无类型的(
mixed),不会自动进行类型转换,但在紧急情况下仍然很有用。 -
对于对象的JSON数据,有许多数据导出/输出选项,以便将其从对象中再次获取:作为多级数组、嵌套的
stdClass对象或对象JSON字符串表示。 -
我们包含一系列极其先进的调试功能
您可以通过运行构造函数并使用
$requireAnalysis来确保所有JSON数据都根据您的类属性映射成功映射,并且您没有遗漏任何存在于数据中的属性。在任何问题的情况下,分析消息将为您提供整个JSON数据层次结构中遇到的所有问题的完整列表。对于您自己的类属性映射,您可以通过运行如
printPropertyDescriptions()之类的函数来查看所有属性及其定义的完整列表。这有助于调试类继承和导入,以直观地看到最终的类映射,并帮助用户查看所有可用的属性及其所有虚拟函数。对于JSON数据,您可以使用如
printJson()之类的函数来获得所有内部JSON数据的美丽视图,这在您(或您的用户)需要了解当前对象实例的数据存储中有什么可用时非常有帮助。 -
精细且逻辑的异常系统确保您可以始终信任对象的行为,并且可以轻松地捕获问题。我们抛出的所有内容都是基于
LazyJsonMapperException,这意味着当您不关心精细区分时,您可以简单地捕获单个“根”异常。 -
干净且模块化的代码确保了稳定性和未来的可扩展性。
-
深入代码文档解释了您可能想知道的一切。
-
最后,我们实现了超级高效的对象序列化。所有内容都存储在紧密打包的格式中,当您需要在运行时之间传输对象时,可以最小化数据大小。
安装
您至少需要PHP 5.6或更高版本。PHP 7+也完全支持,并推荐使用。
运行以下Composer安装命令
composer require lazyjsonmapper/lazyjsonmapper
示例
查看examples/文件夹的内容。[GitHub链接](https://github.com/SteveJobzniak/LazyJsonMapper/tree/master/examples)
文档
此库的源代码中直接提供了全面的文档。
您还可以在线阅读相同的文档,格式为漂亮的HTML页面。
LazyDoctor
我们的自动类文档和诊断工具将放置在您的项目文件夹的./vendor/bin/中。只需在没有参数的情况下运行它,即可查看所有可用选项的列表。您还可以在常规文本编辑器中打开该文件,阅读实用程序源代码顶部的通用使用技巧和窍门。
版权
版权所有2017 LazyJsonMapper项目
许可证
作者
SteveJobzniak
贡献
如果您想为此项目做出贡献,请随时提交一个pull request,或者甚至可以向团队成员捐赠以表示您的感谢。