VarExporter组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

VarExporter组件

VarExporter组件将任何可序列化的PHP数据结构导出到纯PHP代码,并允许实例化和填充对象,而无需调用它们的构造函数。

安装

1
开发symfony/var-export欧宝娱乐app下载地址

请注意

如果在Symfony应用程序外部安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

出口/序列化变量

该组件的主要特性是将PHP数据结构序列化为纯PHP代码,类似于PHP的代码var_export功能:

1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址组件VarExporterVarExporter出口= VarExporter::出口(someVariable);//将$export数据存储在某个文件或缓存系统中以供以后重用数据=写入“exported.php”出口);//之后,在需要时重新生成原始变量regeneratedVariable需要“exported.php”

使用此组件而不是serialize ()igbinary是业绩:感谢OPcache,生成的代码比实际使用的代码要快得多,内存效率也更高unserialize ()igbinary_unserialize ()

此外,还有一些小的区别:

  • 如果原始变量定义了它们,则与之关联的所有语义serialize ()(如__wakeup ()__sleep (),可序列化的)保存下来(var_export ()忽略了他们);
  • 引用涉及SplObjectStorageArrayObjectArrayIterator实例被保存;
  • 缺少类会抛出ClassNotFoundException而不是被反序列化PHP_Incomplete_Class对象;
  • 反射*IteratorIterator而且RecursiveIteratorIterator类在序列化时抛出异常。

导出的数据为aPSR-2兼容的PHP文件。例如考虑下面的类层次结构:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
摘要AbstractClass受保护的喷火私人酒吧受保护的函数setBar酒吧->酒吧=酒吧;}}ConcreteClass扩展AbstractClass公共函数__construct()->foo =123->setBar (234);}}

当导出ConcreteClass使用VarExporter,生成的PHP文件看起来像这样:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<?php返回\欧宝娱乐app下载地址 Symfony \ \ VarExporter \ \水合器内部组件::水合物(o= (克隆(\欧宝娱乐app下载地址 Symfony \内部组件\ VarExporter \ \注册表:: $原型(“欧宝娱乐app下载地址Symfony \ \测试组件\ \ VarExporter \ \ \ \ ConcreteClass ') ? ?\欧宝娱乐app下载地址 Symfony \内部组件\ VarExporter \ \注册表::p (“欧宝娱乐app下载地址Symfony \ \测试组件\ \ VarExporter \ \ \ \ ConcreteClass '),),, (“欧宝娱乐app下载地址Symfony \ \测试组件\ \ VarExporter \ \ \ \ AbstractClass '= > [“foo”= > [123),“酒吧”= > [234,],],],,o0], []);

实例化PHP类

该组件提供的另一个主要特性是实例化器,它可以创建对象并设置它们的属性,而无需调用它们的构造函数或任何其他方法:

12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址组件VarExporterInstantiator//创建一个空的Foo实例fooObject= Instantiator::实例化(Foo::类);//创建一个Foo实例并设置它的一个属性fooObject= Instantiator::实例化(Foo::类,“propertyName”= >propertyValue]);//创建一个Foo实例并设置父类Bar上定义的私有属性fooObject= Instantiator::实例化(Foo::class, [], [Bar .::Class => [“privateBarProperty”= >propertyValue)));

的实例ArrayObjectArrayIterator而且SplObjectHash可以用特殊创造吗“\ 0”属性名称来定义它们的内部值:

1 2 3 4 5 6 7 8 9
//创建一个SplObjectHash,其中$info1与$object1相关联。对象= Instantiator::实例化(SplObjectStorage::类,“\ 0”= > [中的object1info1object2info2...]]);//创建一个数组对象,填充$inputArray对象= Instantiator::实例化(ArrayObject::类,“\ 0”= > [inputArray]]);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。