2012-06-17 94 views
0

请看下面给出的代码。对象序列化 - 问题

class Connection 
{ 
    protected $link; 
    private $server, $username, $password, $db, $cnt; 

    public function __construct($server, $username, $password, $db) 
    { 
     $this->server = $server; 
     $this->username = $username; 
     $this->password = $password; 
     $this->db = $db; 
     $this->cnt = 1; 
     $this->connect(); 
    } 

    public function connect() 
    { 
     echo '<br /> in connect '.($this->cnt++); 
     $this->link = mysql_connect($this->server, $this->username, $this->password); 
     mysql_select_db($this->db, $this->link); 
    } 

    public function __sleep() 
    { 
     echo '<br />in sleep'; 
     return array('server', 'username', 'password', 'db'); 
    } 

    public function __wakeup() 
    { 
     echo '<br /> in wake up'; 
     $this->connect(); 
    } 
} 
$obj = new Connection('server', 'test', 'test', 'test'); 
$s = serialize($obj); 
$obj->connect(); 
unserialize($s); 

如果我没有错那么,Serialize应该销毁所有其他类的成员。

$s = serialize($obj); 
    $obj->connect(); 
    unserialize($s); 

'服务器','用户名','密码','db'属性'cnt'的序列化应该被销毁。但是当我调用$ obj-> connect();它给了我这个 - $> CNT值....

PLZ解释

+0

为什么序列化'服务器','用户名','密码','数据库'属性'cnt'应该销毁?所有这些都会被摧毁? – Andreas

+0

是的...但是当你在serialize之后调用connect时,它仍然连接到db和ptint cnt作为2 ---这意味着变量不会被销毁......它们是可用的 –

回答

0

连载()处理所有类型,除了资源型。因此从mysql_connect返回的资源将不会被序列化。