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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.