预定义接口
在线手册:中文  英文

序列化接口

(No version information available, might only be in SVN)

简介

自定义序列化的接口。

实现此接口的类将不再支持 __sleep()__wakeup()。不论何时,只要有实例需要被序列化,serialize 方法都将被调用。它将不会调用 __destruct() 或有其他影响,除非程序化地调用此方法。当数据被反序列化时,类将被感知并且调用合适的 unserialize() 方法而不是调用 __construct()。如果需要执行标准的构造器,你应该在这个方法中进行处理。

接口摘要

Serializable {
/* 方法 */
abstract public string serialize ( void )
abstract public mixed unserialize ( string $serialized )
}

Example #1 Basic usage

<?php
class obj implements Serializable {
    private 
$data;
    public function 
__construct() {
        
$this->data "My private data";
    }
    public function 
serialize() {
        return 
serialize($this->data);
    }
    public function 
unserialize($data) {
        
$this->data unserialize($data);
    }
    public function 
getData() {
        return 
$this->data;
    }
}

$obj = new obj;
$ser serialize($obj);

$newobj unserialize($ser);

var_dump($newobj->getData());
?>

以上例程的输出类似于:

string(15) "My private data"

Table of Contents


预定义接口
在线手册:中文  英文

用户评论:

marcos dot gottardi at folha dot REM0VE-THIS dot com dot br (2012-01-13 09:05:09)

Serializing child and parent classes:

<?php
class MyClass implements Serializable {
    private 
$data;
    
    public function 
__construct($data) {
        
$this->data $data;
    }
    
    public function 
getData() {
        return 
$this->data;
    }
    
    public function 
serialize() {
        echo 
"Serializing MyClass...\n";
        return 
serialize($this->data);
    }
    
    public function 
unserialize($data) {
        echo 
"Unserializing MyClass...\n";
        
$this->data unserialize($data);
    }
}

class 
MyChildClass extends MyClass {
    private 
$id;
    private 
$name;
    
    public function 
__construct($id$name$data) {
        
parent::__construct($data);
        
$this->id $id;
        
$this->name $name;
    }
    
    public function 
serialize() {
        echo 
"Serializing MyChildClass...\n";
        return 
serialize(
            array(
                
'id' => $this->id,
                
'name' => $this->name,
                
'parentData' => parent::serialize()
            )
        );
    }
    
    public function 
unserialize($data) {
        echo 
"Unserializing MyChildClass...\n";
        
$data unserialize($data);
        
        
$this->id $data['id'];
        
$this->name $data['name'];
        
parent::unserialize($data['parentData']);
    }
    
    public function 
getId() {
        return 
$this->id;
    }
    
    public function 
getName() {
        return 
$this->name;
    }
}

$obj = new MyChildClass(15'My class name''My data');

$serial serialize($obj);
$newObject unserialize($serial);

echo 
$newObject->getId() . PHP_EOL;
echo 
$newObject->getName() . PHP_EOL;
echo 
$newObject->getData() . PHP_EOL;

?>

This will output:

Serializing MyChildClass...
Serializing MyClass...
Unserializing MyChildClass...
Unserializing MyClass...
15
My class name
My data

Anonymous (2011-07-05 07:01:02)

You cannot throw an exception inside the serialize() method.  This will cause PHP to complain that you are not returning a string or NULL.

The best way to prevent the serialization of an object is to throw an Exception in the __sleep() method:

<?php
class Obj {
  public function 
__sleep() {
    throw new 
BadMethodCallException('You cannot serialize this object.');
  }
}
?>

Anonymous (2011-05-12 06:09:23)

You can prevent an object getting unserialized by returning NULL. Instead of a serialized object, PHP will return the serialized form of NULL:

<?php
class testNull implements Serializable {
    public function 
serialize() {        
        return 
NULL;
    }
    public function 
unserialize($data) {
    }
}

$obj = new testNull;
$string serialize($obj);
echo 
$string// "N;"
?>

That's perhaps better than throwing exceptions inside of the serialize function if you want to prevent serialization of certain objects.

易百教程