Heim  >  Artikel  >  Backend-Entwicklung  >  PHP objektorientiert – detaillierte Code-Erklärung der Objektserialisierung serialize(), __sleep(), __wakeup()

PHP objektorientiert – detaillierte Code-Erklärung der Objektserialisierung serialize(), __sleep(), __wakeup()

黄舟
黄舟Original
2017-03-27 09:43:541807Durchsuche

Manchmal ist es notwendig, ein Objekt in das Netzwerk hochzuladen und zu übertragen. Um die Übertragung zu erleichtern, kann das gesamte Objekt in eine Binärzeichenfolge umgewandelt und dann wiederhergestellt werden Wenn es am anderen Ende des Objekts ankommt, nennt man diesen Vorgang Serialisierung (auch Serialisierung genannt), genau wie wir jetzt ein Auto per Schiff in die USA transportieren wollen, da das Auto relativ groß ist, können wir es zerlegen Wir zerlegen das Auto in kleinere Teile, und dann transportieren wir diese Teile per Rad in die Vereinigten Staaten und bauen sie dann wieder in das Auto ein.
Laienhaft ausgedrückt ist Serialisierung eine Methode, die durch eine Variable dargestellten „Speicher“-Daten in eine „String“-Datenform umzuwandeln und sie während der Deserialisierung auf der Festplatte beizubehalten. Es handelt sich um einen umgekehrten Prozess.
Es gibt zwei Situationen, in denen wir Objekte serialisieren müssen. Die erste Situation ist, wenn ein Objekt über das Netzwerk übertragen wird, und die zweite Situation ist, wenn das Objekt in eine Datei oder Datenbank geschrieben wird.
Bei der Serialisierung gibt es zwei Prozesse, bei denen es sich um die Konvertierung eines Objekts in eine Binärzeichenfolge handelt, und bei dem anderen um die Deserialisierung (auch Deserialisierung genannt). die vom Objekt in ein Objekt umgewandelte Binärzeichenfolge. Wir verwenden die Funktion unserialize(), um ein Objekt zu deserialisieren.
Der Parameter der Funktion serialize() in PHP ist der Objektname und der Rückgabewert ist eine Zeichenfolge. Die von Serialize() zurückgegebene Zeichenfolge hat im Allgemeinen keine Analyse, um die Objektinformationen zu erhalten Wir müssen nur zurückgeben. Diese Zeichenfolge kann an das andere Ende des Netzwerks übertragen oder in einer Datei gespeichert werden.
Die Funktion unserialize() wird zum Deserialisieren von Objekten verwendet. Der Parameter dieser Funktion ist der Rückgabewert der Funktion serialize(). Die Ausgabe ist natürlich das reorganisierte Objekt.
 
Serialisierung von Objekten:

  1. Die Serialisierung eines Objekts kann nur seine Attributdaten „speichern“, und die Methode ist Ignorieren (Methode ist keine Daten). )

  2. Wenn ein Objekt serialisiert wird, wird die magische Methode der Klasse, zu der das Objekt gehört, automatisch aufgerufen: sleep()

Deserialisierung von Objekten:

  1. Bei der Deserialisierung eines Objekts handelt es sich tatsächlich um die ursprünglich während der Wiederherstellungsphase gespeicherten Attributdaten, auf die Sie sich zu diesem Zeitpunkt verlassen müssen Die ursprüngliche Klasse des Objekts .

  2. Wenn ein Objekt deserialisiert wird, wird die magische Methode der Klasse, zu der das Objekt gehört, automatisch aufgerufen: wakeup()

Alles serialisieren

1.serialize(object name)

Serialisiert das angegebene Klassenobjekt $str =serialize($per) // Das Per-Objekt serialisieren und das Ergebnis an $str zurückgeben
 
Serialisierungsmethode:

$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 );  //将任何类型的变量数据,转换为“字符串”
file_put_contents( '要保存的目标文本文件', $s1 );    //将该字符串,保存到一个文件里(就是硬盘数据)

2 .unserialize (Rückgabewert nach Serialisierung)

Deserialisierung, das Rückgabeergebnis ist ein Objekt $per=unserialize($str);

Deserialisierungsmethode:

$s1 = file_get_contens( '保存序列化数据的目标文本文件' );    //从一个文件里读出其中的所有字符
$v1 = unserialize($s1);   //将该字符串数据,反序列化转换为变量(数据)

Beispiele für Serialisierung und Deserialisierung

<?phpclass Person{
    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}$p1 = new Person("张三", "男", 20);$p1_string = serialize($p1);    //把一个对象串行化,返一个字符串
echo $p1_string . "<br>";        
//串行化的字符串我们通常不去解析//将$p1_string存储到文件file.txt中file_put_contents(&#39;./file.txt&#39;, $p1_string);
$p2 = unserialize($p1_string);    //把一个串行化的字符串反串行化形成对象
$p2$p2->say();//下面的做法和上面效果一样
$p3_file = file_get_contents(&#39;./file.txt&#39;); //读取文件
$p3 = unserialize($p3_file); //反序列化
$p3->say();?>

Die Ausgabe des obigen Beispiels:

O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}我的名字叫:张三 性别:男 我的年龄是:20

Teilweise Serialisierung

1.sleep()

Serialisieren Sie einige Attribute eines Objekts.

2.wakeup()

Initialisieren (tatsächlich ändern) Sie beim Deserialisieren den Objektinhalt
In PHP5 gibt es Die beiden Magie Methoden: Sleep()-Methode und Wakeup()-Methode. Wenn das Objekt serialisiert wird, wird eine Sleep()-Methode aufgerufen, um einige Dinge vor dem Schlafengehen abzuschließen, und wenn es wieder aufwacht, wird eine Binärzeichenfolge neu gebildet. Objekt wird automatisch eine weitere PHP-Funktion wakeup() aufgerufen, um einige Aktionen auszuführen, die das Objekt ausführen wird, wenn es aufwacht. Die Funktion „sleep()“ akzeptiert keine Parameter, sondern gibt ein Array zurück, das die Eigenschaften enthält, die serialisiert werden müssen. Nicht enthaltene Attribute werden bei der Serialisierung ignoriert. Wenn keine Sleep()-Methode vorhanden ist, speichert PHP alle Attribute.

<?class Person{

    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }    //指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex
    function sleep() {
        $arr = array("name", "age"); // 此时,属性$sex将被删除!!!

        return($arr);
    }    //重新生成对象时,并重新赋值$age为40
    function wakeup() {
        $this->age = 40;
    }
}$p1 = new Person("张三", "男", 20);//把一个对象串行化,返一个字符串,调用了sleep()方法,忽略没在数组中的属性
$sex$p1_string = serialize($p1);
echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析
$p2 = unserialize($p1_string); //反串行化形成对象$p2重新赋值
$age为40
$p2->say();?>

Die Ausgabe des obigen Beispiels ist:

O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}我的名字叫:张三 性别: 我的年龄是:40

Das obige ist der detaillierte Inhalt vonPHP objektorientiert – detaillierte Code-Erklärung der Objektserialisierung serialize(), __sleep(), __wakeup(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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