ホームページ  >  記事  >  バックエンド開発  >  PHPの__sleepと__wakeup

PHPの__sleepと__wakeup

巴扎黑
巴扎黑オリジナル
2016-11-23 11:55:021245ブラウズ

phpでは、__sleepと__wakeupはそれぞれオブジェクトのシリアル化の前後に呼び出されるメソッドです。このうち、__sleepはパラメータを受け取りませんが、配列を返します。次の例のように、どの属性をシリアル化する必要があるか:

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 が使用されるため、creadit Cardnumber 属性はシリアル化されません。そのため、逆シリアル化では、unserialize を呼び出す前に、たとえば、ここではデータベース内のデータを再取得してから操作を実行できます


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。