将 stdClass 对象转换/强制转换为另一个类

2022-08-30 07:33:30

我使用的是第三方存储系统,无论我出于某种不起眼的原因输入什么,它只会返回我stdClass对象。因此,我很好奇是否有办法将stdClass对象强制转换/转换为给定类型的完整对象。

例如,类似以下内容的内容:

//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;

我只是将 stdClass 放入数组中并将其提供给 BusinessClass 构造函数,但也许有一种方法可以恢复我不知道的初始类。

注意:我对“更改存储系统”类型的答案不感兴趣,因为它不是感兴趣的问题。请将其视为有关语言能力的学术问题。

干杯


答案 1

请参阅有关可能转换的类型杂耍的手册

允许的强制转换是:

  • (int), (整数) - 转换为整数
  • (布尔),(布尔值) - 强制转换为布尔值
  • (浮点),(双),(真实)- 投射到浮点
  • (字符串)- 转换为字符串
  • (数组)- 强制转换为数组
  • (对象) - 强制转换为对象
  • (未设置)- 转换为 NULL (PHP 5)

您必须编写一个映射器,用于将转换从 stdClass 转换为另一个具体类。应该不会太难做到。

或者,如果您心情不好,可以改编以下代码:

function arrayToObject(array $array, $className) {
    return unserialize(sprintf(
        'O:%d:"%s"%s',
        strlen($className),
        $className,
        strstr(serialize($array), ':')
    ));
}

它将数组伪转换为特定类的对象。这的工作原理是首先序列化数组,然后更改序列化的数据,使其表示某个类。然后,结果将取消序列化为此类的实例。但就像我说的,这很笨拙,所以期待副作用。

对于对象到对象,代码将是

function objectToObject($instance, $className) {
    return unserialize(sprintf(
        'O:%d:"%s"%s',
        strlen($className),
        $className,
        strstr(strstr(serialize($instance), '"'), ':')
    ));
}

答案 2

您可以使用上述函数来强制转换不相似的类对象(PHP > = 5.3)

/**
 * Class casting
 *
 * @param string|object $destination
 * @param object $sourceObject
 * @return object
 */
function cast($destination, $sourceObject)
{
    if (is_string($destination)) {
        $destination = new $destination();
    }
    $sourceReflection = new ReflectionObject($sourceObject);
    $destinationReflection = new ReflectionObject($destination);
    $sourceProperties = $sourceReflection->getProperties();
    foreach ($sourceProperties as $sourceProperty) {
        $sourceProperty->setAccessible(true);
        $name = $sourceProperty->getName();
        $value = $sourceProperty->getValue($sourceObject);
        if ($destinationReflection->hasProperty($name)) {
            $propDest = $destinationReflection->getProperty($name);
            $propDest->setAccessible(true);
            $propDest->setValue($destination,$value);
        } else {
            $destination->$name = $value;
        }
    }
    return $destination;
}

例:

class A 
{
  private $_x;   
}

class B 
{
  public $_x;   
}

$a = new A();
$b = new B();

$x = cast('A',$b);
$x = cast('B',$a);

推荐