我使用的是第三方存储系统,无论我出于某种模糊的原因输入什么,它都只返回stdClass对象。所以我很想知道是否有一种方法可以将stdClass对象转换/转换为给定类型的完全成熟的对象。
例如,类似这样的东西:
//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;
我只是将stdClass转换为数组并将其提供给BusinessClass构造函数,但也许有一种方法可以恢复我不知道的初始类。
注意:我对“更改您的存储系统”类型的答案不感兴趣,因为这不是重点。请考虑这更多的是一个关于语言能力的学术问题。
干杯
发布于 2012-03-22 04:08:54
你可以使用上面的函数来转换不相似的类对象(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);
发布于 2012-01-21 03:10:09
要将stdClass
的所有现有属性移动到具有指定类名的新对象,请执行以下操作:
/**
* 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;
}
用法:
$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);
输出:
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
运算符是未知的,因为它需要哪些参数。对你的案子来说可能很合适。
发布于 2012-08-28 20:29:22
我也有类似的问题。简化的反射解决方案对我来说很好:
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;
}
https://stackoverflow.com/questions/3243900
复制相似问题