hollodotme/inclomplete-class-accessor

用于访问 __PHP_Incomplete_Class 所有属性的类

v1.0.0 2016-04-24 17:55 UTC

This package is auto-updated.

Last update: 2024-09-10 05:17:20 UTC


README

Build Status Coverage Status

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' );
}

现在您可以将旧序列化对象映射到适当的新对象。