Heim >Backend-Entwicklung >PHP-Tutorial >__sleep und __wakeup in PHP

__sleep und __wakeup in PHP

巴扎黑
巴扎黑Original
2016-11-23 11:55:021309Durchsuche

In PHP sind __sleep und ___wakeup zwei Methoden, die vor und nach der Objektserialisierung aufgerufen werden.
Unter ihnen wird __sleep aufgerufen, bevor ein Objekt serialisiert wird, sondern ein Array zurückgegeben wird kann platzieren, welche Attribute serialisiert werden müssen, wie im folgenden Beispiel:

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”;}

Vor der Serialisierung oben gibt __sleep an, dass nur das Namensattribut serialisiert wird, creeditcard jedoch nicht.

Im Gegenteil, __wakeup wird vor der Deserialisierung ausgelöst, wie im folgenden Beispiel:

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³
 }

Da im obigen Code __sleep während der Serialisierung verwendet wird, gibt es keine Serialisierung der Kreditkartennummer Attribut, daher wird vor dem Aufruf von unserialize zuerst die __wakeup-Methode aufgerufen. Sie können beispielsweise die Daten in der Datenbank erneut abrufen und dann den Vorgang


ausführen
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn