Heim >Backend-Entwicklung >PHP-Tutorial >__sleep und __wakeup in PHP
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