2011-07-04 46 views

回答

9

我必须说,我没有看到方法在第一个例子中序列化的地方。序列化时,没有方法被序列化,只有类名和属性。你可以看到这个,如果你看看序列化的数据

$ser = serialize($object); 
var_dump($ser); 

你会注意到,没有提到的方法。但是,如果您反序列化一个对象,则它将通过类名重新创建。或者换句话说:你会得到一个新的对象,但是用你之前序列化的值。

通常这不像听起来那么重要,因为通常序列化/非序列化的对象应该表现相同。

// serialize 
class A { 
    public $a = null; 
    public function test() { 
    echo "Hello"; 
    } 
} 
$a = new A; 
echo $a->test(); // "Hello" 
$x = serialize($a); 

// unserialize (somewhere else) 
class A { 
    public $a = null; 
    public function test() { 
    echo "World"; 
    } 
} 
$a = unserialize($x); 
echo $a->test(); // "World" 

这里的串行化使用“错误”类和输出是不同的,比预期的一个。只要你确定没有类名冲突,你通常不需要考虑它。

+0

感谢KingCrunch,真棒解释。阅读参考手册时,我做了一些不正确的假设。尽管你的解释很清楚。 –

2

的方法没有串行化,但其中的对象是其成员的类是:

中的对象的方法将不被保存,只有类的名称。

因此,当你反序列化,则获得相同的类的一个实例,这样就可以调用在该序列化的实例的方法中,作为方法是类定义的一部分,而不是对象本身的一个成员。这当然假定您在解序列化时具有完全相同的类定义:

为了能够反序列化()对象,需要定义该对象的类。

+0

这不是一个新鲜的新实例。刚刚返回到序列化该对象的阶段 –

+0

@Shakti:这是一个新实例。你是对的,那就是重建对象的预序列化状态,但是它重建在新实例之上。因为(例如)你可以从文件中读/写序列化的对象,所以在不同的调用过程中没有办法保存实例。 ('($ a === unserialize(serialize($ a)))=== false)') – KingCrunch