为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕婉清6462132 2019-11-11 15:36:17
我正在使用第三方存储系统,无论出于什么原因,无论输入什么内容,它都只会返回stdClass对象。因此,我很想知道是否有一种方法可以将stdClass对象转换/转换为给定类型的完整对象。例如://$stdClass is an stdClass instance$converted = (BusinessClass) $stdClass;我只是将stdClass转换为数组并将其提供给BusinessClass构造函数,但是也许有一种方法可以还原我不知道的初始类。注意:我对“更改存储系统”类型的答案不感兴趣,因为它不是关注点。请考虑更多有关语言能力的学术问题。干杯
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

有关可能的演员,请参见“ 类型变戏法 ” 手册。


允许的强制转换为:


(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), '"'), ':')

    ));

}


查看完整回答
反对 回复 2019-11-11
?
慕沐林林

TA贡献2016条经验 获得超9个赞

要将的所有现有属性移动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操作员的原因,这是有限的,因为它不知道需要哪些参数。对于您的情况可能合适。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信