Serialisasi mungkin tentang mengubah beberapa variabel menjadi aliran string byte, yang membuatnya lebih mudah untuk dikirim dan disimpan. Tentu saja tidak ada hubungannya dengan transmisi dan penyimpanan. Kuncinya adalah dapat diubah kembali menjadi bentuk string dan struktur data asli dapat dipertahankan.
Ada banyak fungsi serialisasi di PHP: serialize(). Fungsi ini mengubah nilai variabel apa pun (kecuali variabel sumber daya) menjadi bentuk string. String dapat disimpan ke file, atau didaftarkan sebagai Sesi, atau bahkan Gunakan curl untuk simulasikan GET/POST untuk mentransfer variabel untuk mencapai efek RPC.
Jika Anda ingin mengubah variabel serial menjadi nilai variabel asli PHP, Anda dapat menggunakan fungsi unserialize().
1. Serialisasi variabel
Mari kita ambil contoh sederhana untuk mengilustrasikan serialisasi dan format penyimpanannya.
Tipe bilangan bulat:
$var = 23;
echo serialize($var);
Keluaran:
i:23;
Tipe titik mengambang:
$var = 1.23;
echo
serialize($
var);
Keluaran:
d:1.2299999999999982236431605997495353221893310546875;
echo serialisasi($var);
$var = "Saya adalah variabel";
echo serialize($var);
Keluaran:
s:16:"Ini adalah sebuah string";
s:8: "Saya adalah variabel";
tipe Boolean:
$var = true;
echo serialisasi($var);
$var = salah;
echo serialisasi($var);
Keluaran:
b:1;
b:0;
Situasi setelah serialisasi tipe dasar di atas sangat jelas. Format penyimpanan setelah serialisasi adalah:
tipe variabel:
[panjang variabel:] nilai variabel;
Mewakili pemisahan. Panjang variabel bersifat opsional, yaitu tersedia dalam tipe string tetapi tidak dalam tipe lain.
Misalnya, setelah bilangan bulat 23 kita diserialkan, maka menjadi: i:23, maka tidak ada panjangnya, hanya tipe dan nilai variabel, i mewakili bilangan bulat, dipisahkan dengan titik dua, dan nilai bilangan bulat 23 disimpan nanti, termasuk floating point tipe (ganda) Tipe byte) sama. Untuk Boolean tipenya adalah b (boolean). Jika benar maka nilai serialnya adalah 1. Jika salah maka nilainya 0.
Untuk nilai
string
, akan ada tambahan nilai tersimpan di tengahnya, yang menyimpan nilai panjang string, misalnya string "Ini adalah string", maka nilai serial yang dihasilkan adalah s:16:"Ini adalah string "; s adalah string, mewakili tipe. Angka 16 di tengah adalah panjang string. Jika Cina, maka setiap karakter Cina disimpan dalam dua karakter. Misalnya, string "Saya adalah variabel", nilai serial yang dihasilkan adalah :s:8:"Saya adalah variabel"; Panjangnya 8 karakter.Selanjutnya kita fokus pada serialisasi variabel array.
Variabel array:
$var = array("abc", "def", "xyz", "123");
echo serialisasi($var);
Keluaran:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz"; i:3;s:3:"123";}
adalah nilai string yang diperoleh dengan membuat serial array $var saya. Array $var kami mencakup 4 elemen string, yaitu "abc", "def" , "xyz", "123" , mari kita menganalisis data serial. Untuk mempermudah, kami mencantumkan data serial dalam format array:
a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}
Susunannya lebih jelas, lihat string awalnya: a:4:{...} Pertama, karakter pertama a menyimpan tipe variabel, yaitu tipe array (array), dan karakter kedua 4 menyimpan elemen array. Jumlahnya, totalnya ada 4, lalu isi elemen array di antara {}. Misalnya, elemen array pertama: i:0;s:3:"abc"; i menyatakan bahwa tipe nilai indeks dari elemen array saat ini adalah bilangan bulat, dan nilainya adalah 0, dan tipe nilai elemen adalah s (string ), Angkanya 3, nilai spesifiknya adalah "abc", diakhiri dengan titik koma, dan seterusnya untuk elemen array berikut.
Mari kita lihat apa yang terjadi jika kita menggunakan string sebagai indeks elemen:
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4" = >"123");
echo serialisasi($var);
Keluaran:
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";}
setelah mengubah ke gaya array:
a:4:
{
s:6:"indeks1";s:3:"abc";
s:6:"indeks2";s:3:"def";
s:6:"indeks3";s:3:"xyz";
s:6:"indeks4";s:3:"123";
}
Sebenarnya tidak jauh berbeda dengan di atas, hanya saja indeks awal berubah menjadi bentuk penyimpanan string. Misalnya elemen pertama: s:6: "index1"; item pertama adalah indeks. Nilai: s:6:"index1"; s adalah tipenya, 6 adalah panjang string indeks, dan "index1" adalah nilai indeks. S:3:"abc"; berikut ini adalah nilai elemennya. Ini mudah dimengerti, jadi saya tidak akan menjelaskan secara detail.
Dari penjelasan di atas, kita memiliki pemahaman umum tentang serialisasi tipe data dasar. Faktanya, kita dapat membuat fungsi serialisasi kita sendiri, atau memperluas dari perspektif ini dan mengembangkan program serialisasi kita sendiri untuk memfasilitasi pertukaran variabel.
Tentu saja, kita juga dapat menggunakan fungsi ini untuk membuat serial array atau variabel lain menjadi string, dan kemudian menggunakan fungsi curl untuk mensimulasikan fungsi GET/POST untuk mendapatkan data dari server jauh tanpa pengguna melakukan tindakan.
2. Serialisasi objek
Serialisasi objek juga merupakan fungsi yang relatif umum. Ia dapat membuat serial suatu objek dan mengubahnya menjadi string, yang dapat disimpan atau dikirim.
Mari kita lihat contohnya dulu:
kelas TestClass
{
var $a;
var $b;
fungsi Kelas Tes()
{
$ini->a = "Ini adalah";
$ini->b = "Ini b";
}
fungsi dapatkanA()
{
kembalikan $ini->a;
}
fungsi dapatkanB()
{
kembalikan $ini->b;
}
}
$obj = Kelas Tes baru;
$str = membuat serial($obj);
echo $str;
Hasil keluaran:
O:9:"TestClass":2:{s:1:"a";s:9:"Ini adalah a";s:1:"b";s:9:"Ini is b";}
Mari kita menganalisis string setelah serialisasi suatu objek.
O:9:"Kelas Tes":2:
{
s:1:"a";s:9:"Ini adalah";
s:1:"b";s:9:"Ini b";
}
Pertama lihat isi objek itu sendiri: O:9:"TestClass":2:O menunjukkan bahwa ini adalah jenis objek (objek), kemudian 9 mewakili nama objek, dan 2 mewakili berapa banyak objek yang ada milik. Melihat isi dari dua atribut:
s:1:"a";s:9:"Ini adalah a"; Sebenarnya, ini mirip dengan isi array "; adalah nama atribut deskripsi. , item kedua s:9: "Ini adalah a"; menjelaskan nilai atribut. Properti berikut serupa.
Izinkan saya berbicara dulu tentang aplikasi serialisasi objek. Konten berikut ini berasal dari manual PHP, dan teks aslinya belum diubah.
serialize() mengembalikan string yang berisi representasi aliran byte dari nilai apa pun yang dapat disimpan dalam PHP. unserialize() dapat menggunakan string ini untuk merekonstruksi nilai variabel asli. Menyimpan objek menggunakan serialisasi akan menyimpan semua variabel dalam objek. Fungsi pada objek tidak disimpan, hanya nama kelasnya saja.
Untuk dapat melakukan unserialize() suatu objek, kelas objek perlu didefinisikan. Artinya, jika Anda membuat serial objek $a dari kelas A di page1.php, Anda akan mendapatkan string yang menunjuk ke kelas A dan berisi nilai semua variabel di $a. Jika Anda ingin melakukan deserialize di page2.php dan merekonstruksi objek $a kelas A, definisi kelas A harus muncul di page2.php. Hal ini dapat dicapai, misalnya, dengan menempatkan definisi kelas A dalam file include dan menyertakan file ini di page1.php dan page2.php.
<?php
// classa.inc:
kelas A
{
var $satu = 1;
fungsi tampilkan_satu()
{
gema $ini->satu;
}
}
// halaman1.php:
include("classa.inc");
$a = A baru;
$s = membuat serial($a);
// Simpan $s di suatu tempat agar page2.php dapat menemukannya
$fp = fopen("toko", "w");
fput($fp, $s);
fclose($fp);
// halaman2.php:
// Baris ini diperlukan untuk deserialisasi normal
include("classa.inc");
$s = meledak("", @file("toko"));
$a = unserialize($s);
// Sekarang Anda dapat menggunakan fungsi show_one() dari objek $a
$a->tampilkan_satu();
?>
Jika Anda menggunakan sesi dan menggunakan session_register() untuk mendaftarkan objek, objek ini akan secara otomatis diserialkan di akhir setiap halaman PHP, dan secara otomatis dideserialisasi di setiap halaman berikutnya. Pada dasarnya ini berarti bahwa ketika objek-objek ini menjadi bagian dari suatu sesi, mereka dapat muncul di halaman mana pun.
Sangat disarankan agar semua halaman menyertakan definisi kelas untuk objek terdaftar ini, meskipun kelas ini tidak digunakan di semua halaman. Jika hal ini tidak dilakukan, dan suatu objek dideserialisasi tetapi kelasnya belum ditentukan, ia akan kehilangan kelas terkaitnya dan menjadi objek stdClass tanpa fungsi apa pun yang tersedia sama sekali, yang sangat tidak berguna.
Jadi jika $a menjadi bagian dari sesi dengan menjalankan session_register("a") pada contoh di atas, file classa.inc harus disertakan di semua halaman, bukan hanya page1.php dan page2.php.
Tentu saja objek berseri sebenarnya bisa diterapkan di banyak tempat. Tentu saja, serialisasi ditangani secara berbeda di PHP 5. Mari kita lihat apa yang tertulis di manual:
serialize() memeriksa apakah ada fungsi dengan nama ajaib __sleep di kelas. Jika demikian, fungsi tersebut akan berjalan sebelum serialisasi apa pun. Ini menghapus objek dan harus mengembalikan array yang berisi nama semua variabel dalam objek yang harus diserialkan.
Tujuan penggunaan __sleep adalah untuk menutup koneksi database apa pun yang mungkin dimiliki objek, mengirimkan data yang tertunda, atau melakukan tugas pembersihan serupa. Selain itu, fungsi ini juga berguna jika Anda memiliki benda berukuran sangat besar yang tidak perlu disimpan seluruhnya.
Sebaliknya, unserialize() memeriksa keberadaan fungsi dengan nama ajaib __wakeup. Fungsi ini dapat merekonstruksi sumber daya apa pun yang dimiliki objek, jika ada.
Tujuan penggunaan __wakeup adalah untuk membangun kembali koneksi database yang mungkin hilang selama serialisasi dan untuk menangani tugas inisialisasi ulang lainnya.