我计划使用对象的序列化和反序列化作为存储方式,我的应用程序可以方便地将大量对象分组到单个对象中进行序列化。但是,这提出了一些我需要解答的问题。
假设我计划序列化的父对象是“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) 的引用。