首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将stdClass对象转换/强制转换为另一个类

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

Stack Overflow用户
提问于 2010-07-14 14:43:47
回答 10查看 115.3K关注 0票数 96

我使用的是第三方存储系统,无论我出于某种模糊的原因输入什么,它都只返回stdClass对象。所以我很想知道是否有一种方法可以将stdClass对象转换/转换为给定类型的完全成熟的对象。

例如,类似这样的东西:

代码语言:javascript
复制
//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;

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

注意:我对“更改您的存储系统”类型的答案不感兴趣,因为这不是重点。请考虑这更多的是一个关于语言能力的学术问题。

干杯

EN

回答 10

Stack Overflow用户

发布于 2012-03-22 04:08:54

你可以使用上面的函数来转换不相似的类对象(PHP >= 5.3)

代码语言:javascript
复制
/**
 * 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;
}

示例:

代码语言:javascript
复制
class A 
{
  private $_x;   
}

class B 
{
  public $_x;   
}

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

$x = cast('A',$b);
$x = cast('B',$a);
票数 55
EN

Stack Overflow用户

发布于 2012-01-21 03:10:09

要将stdClass的所有现有属性移动到具有指定类名的新对象,请执行以下操作:

代码语言:javascript
复制
/**
 * recast stdClass object to an object with type
 *
 * @param string $className
 * @param stdClass $object
 * @throws InvalidArgumentException
 * @return mixed new, typed object
 */
function recast($className, stdClass &$object)
{
    if (!class_exists($className))
        throw new InvalidArgumentException(sprintf('Inexistant class %s.', $className));

    $new = new $className();

    foreach($object as $property => &$value)
    {
        $new->$property = &$value;
        unset($object->$property);
    }
    unset($value);
    $object = (unset) $object;
    return $new;
}

用法:

代码语言:javascript
复制
$array = array('h','n');

$obj=new stdClass;
$obj->action='auth';
$obj->params= &$array;
$obj->authKey=md5('i');

class RestQuery{
    public $action;
    public $params=array();
    public $authKey='';
}

$restQuery = recast('RestQuery', $obj);

var_dump($restQuery, $obj);

输出:

代码语言:javascript
复制
object(RestQuery)#2 (3) {
  ["action"]=>
  string(4) "auth"
  ["params"]=>
  &array(2) {
    [0]=>
    string(1) "h"
    [1]=>
    string(1) "n"
  }
  ["authKey"]=>
  string(32) "865c0c0b4ab0e063e5caa3387c1a8741"
}
NULL

这是有限的,因为new运算符是未知的,因为它需要哪些参数。对你的案子来说可能很合适。

票数 16
EN

Stack Overflow用户

发布于 2012-08-28 20:29:22

我也有类似的问题。简化的反射解决方案对我来说很好:

代码语言:javascript
复制
public static function cast($destination, \stdClass $source)
{
    $sourceReflection = new \ReflectionObject($source);
    $sourceProperties = $sourceReflection->getProperties();
    foreach ($sourceProperties as $sourceProperty) {
        $name = $sourceProperty->getName();
        $destination->{$name} = $source->$name;
    }
    return $destination;
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3243900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档