猿问

将stdClass对象转换/广播到另一个类

我正在使用第三方存储系统,无论出于什么原因,无论输入什么内容,它都只会返回stdClass对象。因此,我很想知道是否有一种方法可以将stdClass对象转换/转换为给定类型的完整对象。


例如:


//$stdClass is an stdClass instance

$converted = (BusinessClass) $stdClass;

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


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


干杯


慕婉清6462132
浏览 478回答 3
3回答

慕姐8265434

有关可能的演员,请参见“ 类型变戏法 ” 手册。允许的强制转换为:(int),(integer)-转换为整数(布尔),(布尔)-转换为布尔(float),(double),(real)-转换为float(字符串)-强制转换为字符串(数组)-强制转换为数组(对象)-投射到对象(未设置)-强制转换为NULL(PHP 5)您将必须编写一个Mapper来执行从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), '"'), ':')    ));}

慕沐林林

要将的所有现有属性移动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操作员的原因,这是有限的,因为它不知道需要哪些参数。对于您的情况可能合适。
随时随地看视频慕课网APP
我要回答