我计划将对象序列化和反序列化作为一种存储方式,并且我的应用程序可以方便地将大量对象分组到单个对象中进行序列化。但是,这提出了一些我需要回答的问题。
假设我计划序列化的父对象是“A”,我存储在其中的对象将是 A(a-z)。如果将 A(b) 传递给 A(c),则按引用传递。因此,如果 A(c) 采取了影响 A(b) 值的操作,这也将更新存储在 A 中的原始 A(b)。太棒了!
但是,当我序列化 A 时,其中 A(c) 引用了 A(b),然后反序列化会发生什么?A(c) 会有 A(b) 的一个新的唯一副本,还是会继续引用存储在 A 中的 A(b)?
答案是,PHP 5.5 和 PHP 7 都跟踪某些东西是否是它在反序列化过程中“重新创建”的已有的对象的引用,请看此示例。
<?php
class foo {
protected $stored_object;
protected $stored_object2;
protected $stored_value;
public function __construct($name, $stored_value) {
$this->store_value($stored_value);
echo '已构造: '.$name.' => '.$stored_value.'<br/>';
}
public function store_object(foo $object) {
$this->stored_object = $object;
}
public function store_object2(foo $object) {
$this->stored_object2 = $object;
}
public function store_value($value) {
$this->stored_value = $value;
}
public function stored_method($method, array $parameters) {
echo '调用存储方法: '.$method.'{ <br/>';
call_user_func_array(array($this->stored_object, $method), $parameters);
echo '} <br/>';
}
public function stored_method2($method, array $parameters) {
echo '调用存储方法 2: '.$method.'{ <br/>';
call_user_func_array(array($this->stored_object2, $method), $parameters);
echo '} <br/>';
}
public function echo_value() {
echo '值: '.$this->stored_value.'<br/>';
}
}
$foo = new foo('foo', 'Hello!'); $new_foo = new foo('new_foo', 'New Foo 2!'); $third_foo = new foo('third_foo', 'Final Foo!'); $foo->store_object($new_foo);
$foo->store_object2($third_foo);
$foo->stored_method('store_object', array($third_foo)); $serialized = serialize($foo);
unset($foo);
unset($new_foo);
unset($third_foo);
$unserialized_foo = unserialize($serialized);
$unserialized_foo->stored_method2('store_value', array('Super Last Foo!')); $unserialized_foo->echo_value(); $unserialized_foo->stored_method('echo_value', array());
$unserialized_foo->stored_method('stored_method', array('echo_value', array()));
?>
根据最后一行,A(b) 中 A(c) 的 "副本" 仍然是存储在 A 中的原始 A(b) 的引用,即使在反序列化之后。