VarExporter组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
VarExporter组件
VarExporter组件将任何可序列化的PHP数据结构导出到纯PHP代码,并允许实例化和填充对象,而无需调用它们的构造函数。
安装
1
$开发symfony/var-exportob娱乐下载
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
出口/序列化变量
该组件的主要特性是将PHP数据结构序列化为纯PHP代码,类似于PHP的代码var_export功能:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\VarExporter\VarExporter;$出口= VarExporter::出口($someVariable);//将$export数据存储在某个文件或缓存系统中以供以后重用$数据=写入“exported.php”,$出口);//之后,在需要时重新生成原始变量$regeneratedVariable=需要“exported.php”;
使用此组件而不是serialize ()
或igbinary
是业绩:感谢OPcache,生成的代码比实际使用的代码要快得多,内存效率也更高unserialize ()
或igbinary_unserialize ()
.
此外,还有一些小的区别:
- 如果原始变量定义了它们,则与之关联的所有语义
serialize ()
(如__wakeup ()
,__sleep ()
,可序列化的
)保存下来(var_export ()
忽略了他们); - 引用涉及
SplObjectStorage
,ArrayObject
或ArrayIterator
实例被保存; - 缺少类会抛出
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返回\ob娱乐下载 Symfony \ \ VarExporter \ \水合器内部组件::水合物($o= (克隆(\ob娱乐下载 Symfony \内部组件\ VarExporter \ \注册表:: $原型(“ob娱乐下载Symfony \ \测试组件\ \ VarExporter \ \ \ \ ConcreteClass ') ? ?\ob娱乐下载 Symfony \内部组件\ VarExporter \ \注册表::p (“ob娱乐下载Symfony \ \测试组件\ \ VarExporter \ \ \ \ ConcreteClass '),),零, (“ob娱乐下载Symfony \ \测试组件\ \ VarExporter \ \ \ \ AbstractClass '= > [“foo”= > [123),“酒吧”= > [234,],],],,$o[0], []);
实例化PHP类
该组件提供的另一个主要特性是实例化器,它可以创建对象并设置它们的属性,而无需调用它们的构造函数或任何其他方法:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\VarExporter\Instantiator;//创建一个空的Foo实例$fooObject= Instantiator::实例化(Foo::类);//创建一个Foo实例并设置它的一个属性$fooObject= Instantiator::实例化(Foo::类,“propertyName”= >$propertyValue]);//创建一个Foo实例并设置父类Bar上定义的私有属性$fooObject= Instantiator::实例化(Foo::class, [], [Bar .::Class => [“privateBarProperty”= >$propertyValue)));
的实例ArrayObject
,ArrayIterator
而且SplObjectHash
可以用特殊创造吗“\ 0”
属性名称来定义它们的内部值:
1 2 3 4 5 6 7 8 9
//创建一个SplObjectHash,其中$info1与$object1相关联。$对象= Instantiator::实例化(SplObjectStorage::类,“\ 0”= > [$中的object1,$info1,$object2,$info2...]]);//创建一个数组对象,填充$inputArray$对象= Instantiator::实例化(ArrayObject::类,“\ 0”= > [$inputArray]]);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。