亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將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 關注
  • 502 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號