>  기사  >  백엔드 개발  >  PHP의 __sleep 및 __wakeup

PHP의 __sleep 및 __wakeup

巴扎黑
巴扎黑원래의
2016-11-23 11:55:021283검색

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 메서드가 호출됩니다. 예를 들어 데이터베이스에서 데이터를 다시 가져온 다음


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