3 回答

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

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操作員的原因,這是有限的,因為它不知道需要哪些參數。對于您的情況可能合適。
- 3 回答
- 0 關注
- 502 瀏覽
添加回答
舉報