hollodotme / inclomplete-class-accessor
用于访问 __PHP_Incomplete_Class 所有属性的类
v1.0.0
2016-04-24 17:55 UTC
Requires
- php-64bit: >=5.5
Requires (Dev)
- satooshi/php-coveralls: dev-master
This package is auto-updated.
Last update: 2024-09-10 05:17:20 UTC
README
IncompleteClassAccessor
用于访问 __PHP_Incomplete_Class 所有属性的类
请注意: 这是一个概念证明,不应该在生产软件中使用。
用例
- 您有一个对象被序列化并存储到例如数据库中。
- 随着时间的推移,底层类已被修改、移动或删除。
- 您从存储中读取序列化的对象,并收到一个
__PHP_Incomplete_Class
对象。 - 您想读取对象的属性,即使是私有的。
PHP 内置
- PHP 无法方便地从这样的对象中读取私有属性。
ReflectionClass
不发布任何属性。 - 可用的
unserialize_callback_func
只允许您通过名称加载适当的类(该类可能已经不存在)。
IncompleteClassAccessor 做什么
- 从
__PHP_Incomplete_Class
对象中读取原始类的名称。 - 它序列化
__PHP_Incomplete_Class
对象。 - 它修改生成的序列化字符串,将
__PHP_Incomplete_Class
对象转换为stdClass
对象。 - 它反序列化修改后的字符串,并将所有(现在可访问的)对象属性读取到一个键值数组中。
- 如果属性值本身是
__PHP_Incomplete_Class
对象,它为该值创建一个IncompleteClassAccessor
实例。 (因此它是递归的。)
示例用法
<?php namespace MyVendor\MyProject; use hollodotme\IncompleteClassAccessor\IncompleteClassAccessor; # 1. Read some serialized object $serialized = file_get_contents( '/tmp/serialized.txt' ); # 2. Unserialize $unserialzed = unserialize( $serialized ); # 3. Check for __PHP_Inclomplete_Class if ( $unserialzed instanceof \__PHP_Inclomplete_Class ) { $accessor = new IncompleteClassAccessor( $unserialized ); # Print the original class name echo $accessor->getOriginalClassName(); # Print all properties print_r( $accessor->getProperties() ); # Print a single property echo $accessor->getProperty( 'someProperty' ); }
现在您可以将旧序列化对象映射到适当的新对象。