Bei der Serialisierung geht es wahrscheinlich darum, einige Variablen in einen Bytestrom aus Zeichenfolgen umzuwandeln, was die Übertragung und Speicherung erleichtert. Natürlich hat das nichts mit Übertragung und Speicherung zu tun. Der Schlüssel liegt darin, dass es wieder in eine Zeichenfolgenform umgewandelt werden kann und die ursprüngliche Datenstruktur beibehalten werden kann.
Es gibt viele Serialisierungsfunktionen in PHP: serialize(). Diese Funktion konvertiert jeden Variablenwert (außer Ressourcenvariablen) in die Form einer Zeichenfolge. Die Zeichenfolge kann in einer Datei gespeichert oder als Sitzung registriert werden, oder sogar mit Curl Simulieren Sie GET/POST, um Variablen zu übertragen und den Effekt von RPC zu erzielen.
Wenn Sie serialisierte Variablen in PHP-Originalvariablenwerte konvertieren möchten, können Sie die Funktion unserialize() verwenden.
1. Variable Serialisierung
Nehmen wir ein einfaches Beispiel, um die Serialisierung und ihr Speicherformat zu veranschaulichen.
Ganzzahltyp:
$var = 23;
echo serialize($var);
Ausgabe
:
i:23;
Fließkommatyp:
$var = 1.23;
echo
serialize
($var)
;
echo serialize($var);
$var = „Ich bin eine Variable“;
echo serialize($var);
Ausgabe:
s:16:"Dies ist ein String";
s:8: „Ich bin eine Variable“;
Boolescher Typ:
$var = true;
echo serialize($var);
$var = false;
echo serialize($var);
Ausgabe:
b:1;
b:0;
Die Situation nach der Serialisierung der oben genannten Grundtypen ist sehr klar:
Variablentyp:
[Variablenlänge:] Variablenwert;
Stellt die Aufteilung dar. Die Variablenlänge ist optional, das heißt, sie ist im Zeichenfolgentyp verfügbar, in anderen Typen jedoch nicht. Der letzte Wert ist der Wert der Variable, der mit „;“ endet.
Nachdem unsere Ganzzahl 23 beispielsweise serialisiert wurde, lautet sie: i:23. Dann hat sie keine Länge, sondern nur Typ und Variablenwert Typ (Doppel-Byte-Typ) ist derselbe. Für Boolean ist der Typ b (boolean). Wenn er wahr ist, ist der serialisierte Wert 1. Wenn er falsch ist, ist der Wert 0.
Bei
Zeichenfolgenwerten
gibt es in der Mitte einen zusätzlichen gespeicherten Wert, der den Längenwert der Zeichenfolge speichert, z. B. die Zeichenfolge „Dies ist eine Zeichenfolge“. Der generierte serialisierte Wert lautet dann s:16: „Dies ist eine Zeichenfolge“. "; s ist eine Zeichenfolge, die den Typ darstellt. Die 16 in der Mitte ist die Länge der Zeichenfolge. Wenn es sich um Chinesisch handelt, wird jedes chinesische Zeichen in zwei Zeichen gespeichert. Zum Beispiel die Zeichenfolge „Ich bin eine Variable“, Der generierte serialisierte Wert ist :s:8:"Ich bin eine Variable"; er ist 8 Zeichen lang.Als nächstes konzentrieren wir uns auf die Serialisierung von Array-Variablen.
Array-Variable:
$var = array("abc", "def", "xyz", "123");
echo serialize($var);
Ausgabe:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz"; i:3;s:3:"123";}
ist der String-Wert, der durch die Serialisierung meines Arrays $var erhalten wird. Unser $var-Array enthält 4 String-Elemente, nämlich „abc“, „def“, „xyz“, „123“. Lassen Sie uns die serialisierten Daten analysieren. Der Einfachheit halber listen wir die serialisierten Daten in einem Array-Format auf:
a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}
Die Anordnung ist klarer. Schauen Sie sich die Startzeichenfolge an: a:4:{...} Zuerst speichert das erste Zeichen a den Variablentyp, der der Array-Typ ist, und das zweite 4 speichert die Array-Elemente. Die Anzahl beträgt insgesamt 4 und dann der Inhalt der Array-Elemente zwischen {}. Beispiel: Das erste Array-Element: i:0;s:3:"abc"; i stellt dar, dass der Indexwerttyp des aktuellen Array-Elements eine Ganzzahl ist und der Wert 0 ist und der Elementwerttyp s (Zeichenfolge) ist ), Die Zahl ist 3, der spezifische Wert ist „abc“, endet mit einem Semikolon usw. für die folgenden Array-Elemente.
Schauen wir uns an, was passiert, wenn wir Strings als Elementindizes verwenden:
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4" = >"123");
echo serialize($var);
Ausgabe:
a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6: "index3";s:3:"xyz";s:6:"index4";s:3:"123";}
nach dem Wechsel zum Array-Stil:
a:4:
{
s:6:"index1";s:3:"abc";
s:6:"index2";s:3:"def";
s:6:"index3";s:3:"xyz";
s:6:"index4";s:3:"123";
}
Tatsächlich unterscheidet es sich nicht wesentlich von dem oben Gesagten, außer dass sich der Startindex in die Form des Speicherns von Zeichenfolgen ändert: s:6: „index1“; Das erste Element ist der Index. Wert: s:6:"index1"; s ist der Typ, 6 ist die Länge der Indexzeichenfolge und "index1" ist der Wert des Index. Der folgende s:3:"abc"; ist der Elementwert. Dies ist leicht zu verstehen, daher werde ich nicht auf Details eingehen.
Aus dem oben Gesagten haben wir ein allgemeines Verständnis für die Serialisierung grundlegender Datentypen. Tatsächlich können wir unsere eigene Serialisierungsfunktion erstellen oder aus dieser Perspektive unser eigenes Serialisierungsprogramm entwickeln, um unseren Variablenaustausch zu erleichtern.
Natürlich können wir diese Funktion auch verwenden, um ein Array oder eine andere Variable in eine Zeichenfolge zu serialisieren, und dann die Curl-Funktion verwenden, um die GET/POST-Funktion zu simulieren, um Daten vom Remote-Server abzurufen, ohne dass der Benutzer Aktionen ausführen muss.
2. Objektserialisierung Die
Objektserialisierung ist ebenfalls eine relativ häufige Funktion. Sie kann ein Objekt serialisieren und in eine Zeichenfolge umwandeln, die gespeichert oder übertragen werden kann.
Schauen wir uns zunächst ein Beispiel an:
die Klasse TestClass
{
var $a;
var $b;
Funktion TestClass()
{
$this->a = "Das ist ein";
$this->b = "Das ist b";
}
Funktion getA()
{
return $this->a;
}
Funktion getB()
{
return $this->b;
}
}
$obj = neue TestKlasse;
$str = serialize($obj);
echo $str;
Ausgabeergebnis:
O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b";}
Lassen Sie uns die Zeichenfolge nach der Serialisierung eines Objekts analysieren.
O:9:"TestClass":2:
{
s:1:"a";s:9:"Das ist ein";
s:1:"b";s:9:"Das ist b";
}
Schauen Sie sich zunächst den Inhalt des Objekts selbst an: O:9:"TestClass":2:O zeigt an, dass es sich um einen Objekttyp (Objekt) handelt, dann steht 9 für den Namen des Objekts und 2 für die Anzahl der Objekte Eigentum. Betrachten Sie den Inhalt der beiden Attribute:
s:1:"a";s:9:"This is a"; Tatsächlich ähnelt es dem Inhalt des Arrays: s:1:"a "; ist der Beschreibungsattributname. , das zweite Element s:9: "This is a"; beschreibt den Attributwert. Die folgenden Eigenschaften sind ähnlich.
Lassen Sie mich zunächst über eine Anwendung der Objektserialisierung sprechen. Der folgende Inhalt stammt aus dem PHP-Handbuch und der Originaltext wurde nicht geändert.
serialize() gibt einen String zurück, der eine Byte-Stream-Darstellung eines beliebigen Werts enthält, der in PHP gespeichert werden kann. unserialize() kann diesen String verwenden, um den ursprünglichen Variablenwert zu rekonstruieren. Beim Speichern eines Objekts mithilfe der Serialisierung werden alle Variablen im Objekt gespeichert. Die Funktionen im Objekt werden nicht gespeichert, sondern nur der Name der Klasse.
Um ein Objekt unserialisieren() zu können, muss die Klasse des Objekts definiert werden. Das heißt, wenn Sie das Objekt $a der Klasse A in page1.php serialisieren, erhalten Sie eine Zeichenfolge, die auf Klasse A zeigt und die Werte aller Variablen in $a enthält. Wenn Sie es in page2.php deserialisieren und das Objekt $a der Klasse A rekonstruieren möchten, muss die Definition der Klasse A in page2.php erscheinen. Dies kann beispielsweise dadurch erreicht werden, dass die Definition der Klasse A in einer Include-Datei platziert wird und diese Datei sowohl in page1.php als auch in page2.php eingebunden wird.
<?php
// classa.inc:
Klasse A
{
var $one = 1;
function show_one()
{
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// Speichern Sie $s irgendwo, damit page2.php es finden kann
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);
// page2.php:
// Diese Zeile wird für die normale Deserialisierung benötigt
include("classa.inc");
$s = implode("", @file("store"));
$a = unserialize($s);
// Jetzt können Sie die Funktion show_one() des $a-Objekts verwenden
$a->show_one();
?>
Wenn Sie eine Sitzung verwenden und session_register() zum Registrieren von Objekten verwenden, werden diese Objekte am Ende jeder PHP-Seite automatisch serialisiert und auf jeder nachfolgenden Seite automatisch deserialisiert. Im Grunde bedeutet dies, dass diese Objekte, sobald sie Teil einer Sitzung werden, auf jeder Seite angezeigt werden können.
Es wird dringend empfohlen, dass alle Seiten Klassendefinitionen für diese registrierten Objekte enthalten, auch wenn diese Klassen nicht auf allen Seiten verwendet werden. Wenn dies nicht geschieht und ein Objekt deserialisiert wird, aber seine Klasse nicht definiert ist, verliert es seine zugehörige Klasse und wird zu einem Objekt von stdClass ohne jegliche verfügbare Funktionen, was sehr nutzlos ist.
Wenn also $a durch Ausführen von session_register("a") im obigen Beispiel Teil der Sitzung wird, sollte die Datei classa.inc in allen Seiten enthalten sein, nicht nur in page1.php und page2.php.
Natürlich können serialisierte Objekte tatsächlich an vielen Stellen angewendet werden. Natürlich wird die Serialisierung in PHP 5 anders gehandhabt. Schauen wir uns mal an, was im Handbuch steht:
serialize() prüft, ob es in der Klasse eine Funktion mit dem magischen Namen __sleep gibt. Wenn dies der Fall ist, wird die Funktion vor der Serialisierung ausgeführt. Es löscht das Objekt und sollte ein Array zurückgeben, das die Namen aller Variablen im Objekt enthält, die serialisiert werden sollen.
Der Zweck der Verwendung von __sleep besteht darin, etwaige Datenbankverbindungen des Objekts zu schließen, ausstehende Daten zu übermitteln oder ähnliche Bereinigungsaufgaben durchzuführen. Darüber hinaus ist diese Funktion auch dann sinnvoll, wenn Sie sehr große Objekte haben, die nicht komplett eingelagert werden müssen.
Umgekehrt prüft unserialize() die Existenz einer Funktion mit dem magischen Namen __wakeup. Diese Funktion kann alle Ressourcen rekonstruieren, über die das Objekt verfügt, sofern vorhanden.
Der Zweck der Verwendung von __wakeup besteht darin, alle Datenbankverbindungen wiederherzustellen, die möglicherweise während der Serialisierung verloren gegangen sind, und andere Neuinitialisierungsaufgaben zu erledigen.