Serialization

Serialization

Serialization là phương pháp lưu trữ lại object dưới dạng string và chuyển string này thành object. Có hai hàm được sử dụng là hàm serialize() và hàm unserialize().

Ví dụ sử dụng trong trường hợp này là mỗi request trên server cần lưu lại session. Các hàm này sẽ lưu lại dữ liệu của session cho các request lần sau. Session sẽ được lưu lại trên file hoặc database. Tính năng lưu session sử dụng Serialization và PHP đã cung cấp sẵn các hàm với session.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php

class A {
  public $one = 1;
  public function show_one() {
    echo $this->one;
  }
}

$a = new A;
$s = serialize($a);

// $s là thuộc kiểu string
// có thể lưu $s vào file hoặc database
var_dump($s); 

// lấy dữ liệu string để unserialize thành object
$a1 = unserialize($s);
$a->show_one(); // -> 1

Magic method được gọi khi serialize object

Hàm __sleep() sẽ được gọi khi sử dụng hàm serialize(). Hàm __wakeup() sẽ được gọi khi gọi hàm unserialize(). Hàm __sleep() khi cài đặt sẽ phải trả về các thuộc tính mà nó sẽ serialize.

Ví dụ sau đây sẽ lưu lại ba thuộc tính $dsn, $username, $password khi gọi hàm serialize(). Và sẽ gọi hàm connect để kết nối lại khi sử dụng hàm unserialize.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Connection {
  protected $link;
  private $dsn, $username, $password;
  
  public function __construct($dsn, $username, $password) {
    $this->dsn = $dsn;
    $this->username = $username;
    $this->password = $password;
    $this->connect();
  }
  
  private function connect() {
    $this->link = new PDO($this->dsn, $this->username, $this->password);
  }
  
  public function __sleep() {
    return array('dsn', 'username', 'password');
  }
  
  public function __wakeup() {
    $this->connect();
  }
}