>백엔드 개발 >PHP 튜토리얼 >PHP 매직 메소드: __sleep __wakeup

PHP 매직 메소드: __sleep __wakeup

WBOY
WBOY원래의
2016-08-08 09:33:091571검색

php5 이상 버전부터 클래스는 매직 메소드를 사용할 수 있습니다. PHP에서는 두 개의 밑줄(__)로 시작하는 메소드는 매직 메소드로 예약되어 있으므로 기존 매직 메소드를 오버로드하지 않는 한 함수 이름은 __로 시작하지 않는 것이 좋습니다.

PHP의 기존 매직 메소드에는 __construct, __destruct, __call, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __set_state 및 __clone이 포함됩니다.

PHP 매직 메소드의 __sleep __wakeup에 대해 이야기해 보겠습니다.

직렬화는 객체를 포함한 변수를 연속 바이트 데이터로 변환할 수 있습니다. 직렬화된 변수를 파일에 저장하거나 네트워크를 통해 전송할 수 있습니다. 그런 다음 역직렬화하여 원래 데이터로 복원할 수 있습니다. 개체를 직렬화하기 전에 정의하면 PHP는 개체의 속성과 메서드를 성공적으로 저장할 수 있습니다. 때로는 역직렬화 후 즉시 개체를 실행해야 할 수도 있습니다. 이러한 목적으로 PHP는 자동으로 __sleep 및 __wakeup 메서드를 찾습니다.

객체가 직렬화되면 PHP는 __sleep 메서드를 호출합니다(존재하는 경우). 객체를 역직렬화한 후 PHP는 __wakeup 메서드를 호출합니다. 두 메서드 모두 직렬화해야 하는 속성이 포함된 배열을 반환해야 합니다. __sleep 메소드가 없으면 PHP는 모든 속성을 저장합니다.


프로그램이 실행되기 전에 serialize() 함수는 먼저 매직 메서드 __sleep이 있는지 확인합니다. 존재하는 경우 __sleep() 메서드가 먼저 호출됩니다. 그런 다음에만 직렬화(직렬화) 작업이 수행됩니다. 이 함수는 객체를 정리하고 객체의 모든 변수 이름이 포함된 배열을 반환하는 데 사용할 수 있습니다. 메서드가 아무것도 반환하지 않으면 NULL이 직렬화되어 E_NOTICE 오류입니다. 대조적으로, unserialize()는 __wakeup 메소드가 있는지 확인합니다. 존재하는 경우 먼저 호출됩니다. __wakeup 메소드, 객체 데이터를 미리 준비합니다.

__sleep 메소드는 커밋되지 않은 데이터 또는 유사한 작업을 제출하는 데 자주 사용됩니다. 또한 매우 큰 개체가 있는 경우 저장할 필요가 없습니다. 이 기능은 매우 유용합니다. __wakeup은 데이터베이스 연결 재설정이나 기타 초기화 작업 수행과 같은 역직렬화 작업에 자주 사용됩니다.

<?php
class Connection {
    protected $link;
    private $server, $username, $password, $db;
    
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }
    
    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }
    
    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }
    
    public function __wakeup()
    {
        $this->connect();
    }
}
?>

다음 예에서는 __sleep 및 __wakeup 메서드를 사용하여 개체를 직렬화하는 방법을 보여줍니다. Id 속성은 개체에 유지되지 않는 임시 속성입니다. __sleep 메서드는 id 속성이 개체에 포함되지 않도록 합니다. User 개체를 역직렬화할 때 __wakeup 메서드는 id 특성에 대한 새 값을 설정합니다. 이 예제는 실제 개발에서 리소스(예: 이미지 또는 데이터 스트림)를 포함하는 개체를 찾을 수 있습니다. 이러한 방법이 필요합니다.

 <?php
class user {
    public $name;
    public $id;
    
    function __construct() {    // 给id成员赋一个uniq id 
        $this->id = uniqid();
        }
        
    function __sleep() {       //此处不串行化id成员
        return(array('name'));
        }
        
    function __wakeup() {
        $this->id = uniqid();
        }
    }

$u = new user();

$u->name = "Leo"; 

$s = serialize($u); //serialize串行化对象u,此处不串行化id属性,id值被抛弃

$u2 = unserialize($s); //unserialize反串行化,id值被重新赋值

 

//对象u和u2有不同的id赋值

print_r($u);

print_r($u2);

?>

예 3: 객체를 역직렬화하려는 경우 __wakeup 메서드의 결함에 주목해야 합니다.

 <?php 
class A { 
 public $b; 
 public $name; 
} 

class B extends A { 
 public $parent; 
 public function __wakeup() { 
  var_dump($parent->name); 
 } 
} 

$a = new A(); 
$a->name = "foo"; 
$a->b = new B(); 

//我们期望这里输出:foo,但实际在后面的代码执行之后,实际输出NULL.

$a->b->parent = $a; 
$s = serialize($a); 
$a = unserialize($s); 
?> 

이유: $b 개체는 $name 이전에 직렬화되지 않았습니다. 따라서 B::__wakeup이 실행될 때 $a->name에 값이 할당되지 않았습니다.

따라서 클래스에서 변수를 정의하는 순서에 주의하세요.


위 내용은 PHP 매직 메소드의 내용을 포함하여 __sleep __wakeup을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.