Hướng dẫn dùng sleep script trong PHP

Phương thức __sleep() và __wakeup() không được nhắc đến nhiều nhưng với dự án lớn thì sẽ cần thiết. Tài liệu tiếng việt không nói rõ nhiều về hai phương thức này chỉ còn cách xem diễn giải từ tài liệu nước ngoài, bài viết này sẽ giới thiệu về ý nghĩa và cách sử dụng của hai phương thức trên.

 __sleep() được thực thi khi đối tượng được lưu tạm thời thành chuỗi với hàm serialize(), phương thức sẽ trả về mảng các với các phần tử là các thuộc tính sẽ được lưu vào chuỗi với hàm serialize()

__wakeup() được thực thi khi hàm unserialize được gọi, phương thức sẽ phục hồi lại đối tượng được lưu trong chuỗi trả về từ hàm serialize()

Sau đây chúng ta sẽ tìm hiểu cách sử dụng từ ví dụ sau:

Tạo file student.class.php

class Student{
   private $full_name='';
   private $score = 0;
   private $grades = array();
   public function __construct($full_name, $score, $grades){
        $this->full_name = $full_name;
        $this->grades = $grades;
        $this->score = $score;
   }
   public function show(){
        echo $this->full_name;
        print_r( $this->grades);
   }
   function __sleep(){
        echo 'Going to sleep...';
        return array('full_name', 'grades', 'score');
   }
   function __wakeup(){
        echo 'Waking up ...';
   }
}

Ở trên __sleep() trả về mảng với 3 tham số là 3 thuộc tính sẽ được lưu tạm thời với hàm serialize()

Tạo file a.php khởi tạo đối tượng, chạy hàm serialize và lưu chuỗi thông tin vào file string.txt

include 'student.class.php';
$student = new Student('Ngo Van Khuong','a',array('a'=>90,'b'=>100));
$student->show();
$s = serialize($student);
file_put_contents('string.txt',$s);

Chạy file trên trong trình duyệt chúng ta sẽ nhận được "Ngo Van KhuongArray ( [a] => 90 [b] => 100 ) Going to sleep...",  ta thấy phương thức __sleep() đã được thực thi

Tạo file b.php để phục hồi phương thức từ chuỗi tạm thời

include 'student.class.php';
$s = file_get_contents('string.txt');
$a = unserialize($s);
$a->show();

Chạy file trên trong trình duyệt chúng ta sẽ nhận được "Waking up ...Ngo Van KhuongArray ( [a] => 90 [b] => 100 )", ta thấy đối tượng đã được phục hồi và phương thức __wakeup đã được thực thi.

Tham khảo php.net