trismegiste / mikromongo
此包已废弃,不再维护。未建议替代包。
将对象冻结到零开尔文
dev-master
2013-11-19 14:18 UTC
Requires
- php: >=5.4.3
This package is not auto-updated.
Last update: 2022-02-01 12:28:08 UTC
README
另一个对象序列化器,除了这个可以处理递归
什么是
它是一个对象序列化/反序列化器。有很多,但这个可以
- 处理内部PHP对象
- 处理递归(我的意思是对象的指针,嵌套在另一个地方)
- 提取父类的私有属性
- 创建一个对象,无论构造函数是什么
- 对对象的设计绝对没有约束
示例
对象到数组
$transform = new \Trismegiste\ZeroKelvin\Transformer(new \Trismegiste\ZeroKelvin\UuidFactory()); $product = new LightSaber('red'); $product->setOwner(new Owner('vader')); $dump = $transform->toArray($product); print_r($dump); // ouputs [ [ '@classname' => 'tests\\functional\\LightSaber', 'owner' => [ '@ref' => 'dc969571-bf05-420f-a466-1d971dbd9c7b'], '@uuid' => '5b0294f7-65dd-4b17-bcbf-cd1923983649', 'color' => 'red' ], [ '@classname' => 'tests\\functional\\Owner', '@uuid' => 'dc969571-bf05-420f-a466-1d971dbd9c7b', 'name' => 'vader' ] ]
数组到对象
$transform = new \Trismegiste\ZeroKelvin\Transformer(new \Trismegiste\ZeroKelvin\UuidFactory()); $dump = [ [ '@classname' => 'tests\\functional\\LightSaber', 'owner' => [ '@ref' => 'dc969571-bf05-420f-a466-1d971dbd9c7b'], '@uuid' => '5b0294f7-65dd-4b17-bcbf-cd1923983649', 'color' => 'red' ], [ '@classname' => 'tests\\functional\\Owner', '@uuid' => 'dc969571-bf05-420f-a466-1d971dbd9c7b', 'name' => 'vader' ] ]; $product = $transform->fromArray($dump); print_r($product); // ouputs tests\functional\LightSaber Object ( [color:protected] => red [owner:protected] => tests\functional\Owner Object ( [name:protected] => vader ) )
查看完整测试
如何
基于PHP序列化。serialize()和unserialize()是唯一能够处理递归并且将父类中声明为private的隐藏属性的方法。var_dump无法处理递归,var_export无法导出SplObjectStorage,而使用反射递归地检查对象的父类是非常痛苦的。
因此我编写了这个库。后来,我添加了一个存储库服务,可以将这些导出存储到MongoDb中。
为什么
这是一次愚蠢的尝试,想为MongoDb创建一个ODM,但我认为这样做是不明智的
- 对象中噪声太多
- 这太慢了
- 如果对象在数据库中更新,则没有真正的错误处理
- 查询应该是可怕的
- 无法更新
无论如何,这个库对于测试和调试、快速原型设计、简单的CLI应用程序或某些特定用例(如异步事件队列)可能很有用。我必须提到,即使具有高度深度的复杂树结构,从MongoDb加载实体也只需要两次遍历。
扩展此库
您可以通过实现UniqueGenerator接口轻松更改字段名称和主键的生成。
您还可以通过实现RepositoryInterface添加自己的存储库(用于XML文件、CouchDB...)
此库不能做什么?
此库无法处理标量和数组上的引用。虽然应该可以,但导出的数组会携带太多噪声(索引、外键...),以至于没有太大用处。
此库也无法正确存储自定义序列化(实现Serializable php接口)。无论如何,那些对象是“原样”存储的,因此您可以无问题地恢复它们。