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 关注
- 476 浏览
添加回答
举报