PHP에서 __sleep과 ___wakeup은 객체 직렬화 전후에 호출되는 두 가지 메소드입니다.
그 중 __sleep은 객체가 직렬화되기 전에 호출되지만 매개변수를 받지 않고 Array를 반환합니다. 다음 예와 같이 직렬화해야 하는 속성을 배치할 수 있습니다.
class Customer { private $name; private $credit_card_number; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setCC($cc) { $this->credit_card_number = $cc; } public function getCC() { return $this->credit_card_number; } public function __sleep() { return array(“name”); //只有name会序列化 } } $c = new Customer(); $c->setName(“Stuard”); $c->setCC(“456789″); $data = serialize($c).”\n”; echo $data.”\n”; Output: O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Stuard”;}
위의 직렬화 전에 __sleep은 name 속성만 직렬화되지만 creaditcard는 직렬화되지 않도록 지정합니다.
반대로 __wakeup은 다음 예와 같이 역직렬화 전에 트리거됩니다.
class Customer { private $name; private $credit_card_number; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setCC($cc) { $this->credit_card_number = $cc; } public function getCC() { return $this->credit_card_number; } public function __sleep() { return array(“name”); } public function __wakeup() { if($this->name == “Stuart”) { //重新在数据库中获得 $this->credit_card_number = “1234567890123456″; } } } $c = new Customer(); $c->setName(“Stuart”); $c->setCC(“1234567890123456″); $data = serialize($c).”\n”; var_dump(unserialize($data)); Output: object(Customer)#2 (2) { ["name:private"]=> string(5) “Stuart” ["credit_card_number:private"]=> string(16) ’1234567890123456³ }
위 코드에서는 직렬화 중에 __sleep을 사용했기 때문에 신용 카드 번호를 직렬화할 수 없습니다. 속성이므로 unserialize를 호출하기 전에 __wakeup 메서드가 호출됩니다. 예를 들어 데이터베이스에서 데이터를 다시 가져온 다음