Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Zaubermethode: __sleep __wakeup
Ab PHP5 und späteren Versionen können Klassen magische Methoden verwenden. PHP legt fest, dass Methoden, die mit zwei Unterstrichen (__) beginnen, als magische Methoden reserviert sind. Daher wird empfohlen, dass Funktionsnamen nicht mit __ beginnen, es sei denn, dies dient dazu, vorhandene magische Methoden zu überlasten.
Zu den vorhandenen magischen Methoden in PHP gehören __construct, __destruct, __call, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __set_state und __clone.
Lassen Sie uns über __sleep __wakeup in der PHP-Magic-Methode sprechen:
Mit der Serialisierung können Sie Variablen, einschließlich Objekte, in einer Datei speichern oder über das Netzwerk übertragen. Was machen Sie umgekehrt? Vor der Serialisierung seiner Objekte definiert, kann PHP die Eigenschaften und Methoden seiner Objekte erfolgreich speichern. Manchmal muss ein Objekt unmittelbar nach der Deserialisierung ausgeführt werden. Für solche Zwecke sucht PHP automatisch nach der Methode __sleep und __wakeup.
Wenn ein Objekt serialisiert wird, ruft PHP die Methode __sleep auf (sofern vorhanden). Keine der Methoden akzeptiert ein Array, das die zu serialisierenden Eigenschaften enthält verwirft die Werte anderer Eigenschaften. Wenn keine __sleep-Methode vorhanden ist, speichert PHP alle Eigenschaften.
Bevor das Programm ausgeführt wird, prüft die Funktion serialize() zunächst, ob es eine magische Methode __sleep gibt. Wenn vorhanden, wird zuerst die Methode __sleep() aufgerufen.
Erst dann wird der Serialisierungsvorgang (Serialisierung) durchgeführt. Diese Funktion kann verwendet werden, um ein Objekt zu bereinigen und ein Array zurückzugeben, das die Namen aller Variablen im Objekt enthält. Wenn die Methode nichts zurückgibt, wird NULL serialisiert, was zu Folgendem führt:
Ein E_NOTICE-Fehler. Im Gegensatz dazu prüft unserialize(), ob es eine __wakeup-Methode gibt. Wenn es existiert, wird es zuerst aufgerufen
__wakeup-Methode, bereiten Sie Objektdaten im Voraus vor.
Die __sleep-Methode wird häufig zum Übermitteln nicht festgeschriebener Daten oder ähnlicher Vorgänge verwendet. Auch wenn Sie sehr große Objekte haben, Sie müssen nicht speichern, diese Funktion ist sehr nützlich. __wakeup wird häufig bei Deserialisierungsvorgängen verwendet, z. B. beim Wiederherstellen einer Datenbankverbindung oder beim Durchführen anderer Initialisierungsvorgänge.
<?php class Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } ?>
Das folgende Beispiel zeigt, wie ein Objekt mit den Methoden __sleep und __wakeup serialisiert wird. Das Id-Attribut ist ein temporäres Attribut, das nicht im Objekt beibehalten werden soll Serialisiertes Objekt Beim Deserialisieren eines Benutzerobjekts erstellt die __wakeup-Methode einen neuen Wert für das ID-Attribut. In der tatsächlichen Entwicklung stellen Sie möglicherweise fest, dass Objekte, die Ressourcen enthalten (z. B. Bilder oder Datenströme), erforderlich sind diese Methoden.
<?php class user { public $name; public $id; function __construct() { // 给id成员赋一个uniq id $this->id = uniqid(); } function __sleep() { //此处不串行化id成员 return(array('name')); } function __wakeup() { $this->id = uniqid(); } } $u = new user(); $u->name = "Leo"; $s = serialize($u); //serialize串行化对象u,此处不串行化id属性,id值被抛弃 $u2 = unserialize($s); //unserialize反串行化,id值被重新赋值 //对象u和u2有不同的id赋值 print_r($u); print_r($u2); ?>
Beispiel 3: Ein Fehler in der __wakeup-Methode muss beachtet werden. Wenn Sie planen, ein Objekt zu deserialisieren,
<?php class A { public $b; public $name; } class B extends A { public $parent; public function __wakeup() { var_dump($parent->name); } } $a = new A(); $a->name = "foo"; $a->b = new B(); //我们期望这里输出:foo,但实际在后面的代码执行之后,实际输出NULL. $a->b->parent = $a; $s = serialize($a); $a = unserialize($s); ?>
Grund: Das $b-Objekt wird vor $name deserialisiert. Wenn also B::__wakeup ausgeführt wird, wurde $a->name kein Wert zugewiesen.
Achten Sie also sorgfältig auf die Reihenfolge, in der Sie Variablen in Ihrer Klasse definieren.
Das Obige stellt die PHP-Magic-Methode vor: __sleep __wakeup, einschließlich des Inhalts der PHP-Magic-Methode. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.