การทำให้เป็นอนุกรมอาจเกี่ยวกับการแปลงตัวแปรบางตัวให้เป็นสตรีมไบต์ของสตริง ซึ่งทำให้ส่งและจัดเก็บได้ง่ายขึ้น แน่นอนว่าไม่มีอะไรเกี่ยวข้องกับการส่งและการจัดเก็บ สิ่งสำคัญคือสามารถแปลงกลับเป็นรูปแบบสตริงและสามารถรักษาโครงสร้างข้อมูลดั้งเดิมได้
มีฟังก์ชันซีเรียลไลซ์มากมายใน PHP: serialize() ฟังก์ชันนี้จะแปลงค่าตัวแปรใดๆ (ยกเว้นตัวแปรทรัพยากร) ให้อยู่ในรูปของสตริง จำลอง GET/POST เพื่อถ่ายโอนตัวแปรเพื่อให้ได้ผลของ RPC
หากคุณต้องการแปลงตัวแปรซีเรียลไลซ์ให้เป็นค่าตัวแปรดั้งเดิมของ PHP คุณสามารถใช้ฟังก์ชัน unserialize() ได้
1. การทำให้ซีเรียลไลซ์แบบแปรผัน
มาดูตัวอย่างง่ายๆ เพื่อแสดงซีเรียลไลซ์และรูปแบบการจัดเก็บข้อมูล
ประเภทจำนวนเต็ม:
$var = 23;
(
$
var);
เอาต์พุต:
i:23;
ประเภทจุดลอยตัว:
$var = 1.23;
สตริง
:
$var = "นี่คือสตริง";
echo ทำให้เป็นอนุกรม($var);
$var = "ฉันเป็นตัวแปร";
echo serialize($var);
เอาท์พุต:
s:16:"นี่คือสตริง";
s:8: "ฉันเป็นตัวแปร";
ประเภทบูลีน:
$var = true;
echo ทำให้เป็นอนุกรม($var);
$วาร์ = เท็จ;
echo ทำให้เป็นอนุกรม($var);
เอาท์พุต:
b:1;
b:0;
สถานการณ์หลังจากการทำให้เป็นอนุกรมของประเภทพื้นฐานข้างต้นมีความชัดเจนมาก รูปแบบการจัดเก็บข้อมูลหลังจากการทำให้เป็นอนุกรมคือ:
ประเภทของ
ตัวแปร: ค่าตัวแปร [ความยาวตัวแปร:];
แสดงถึงการแยก ความยาวตัวแปรเป็นทางเลือก กล่าวคือ มีอยู่ในประเภทสตริงแต่ไม่มีในประเภทอื่น ค่าสุดท้ายคือค่าตัวแปรแต่ละค่าที่ลงท้ายด้วย ";"
ตัวอย่างเช่น หลังจากเลขจำนวนเต็ม 23 ของเราถูกทำให้เป็นอนุกรมแล้ว มันจะเป็น: i:23 จากนั้นมันไม่มีความยาว มีเพียงประเภทและค่าตัวแปรเท่านั้น i แทนจำนวนเต็ม คั่นด้วยเครื่องหมายทวิภาค และค่าจำนวนเต็ม 23 จะถูกบันทึกในภายหลัง รวมถึงจุดทศนิยม ประเภท (double) Byte type) เหมือนกัน สำหรับบูลีน ชนิดคือ b (บูลีน) หากเป็นจริง ค่าซีเรียลไลซ์จะเป็น 1 หากเป็นเท็จ ค่าจะเป็น 0
สำหรับค่า
สตริง
จะมีค่าที่บันทึกไว้เพิ่มเติมตรงกลาง ซึ่งจะบันทึกค่าความยาวของสตริง เช่น สตริง "นี่คือสตริง" จากนั้นค่าซีเรียลไลซ์ที่สร้างขึ้นคือ s:16:"นี่คือสตริง "; s คือสตริงที่แสดงถึงประเภท เลข 16 ตรงกลางคือความยาวของสตริง ถ้าเป็นภาษาจีน ตัวอักษรจีนแต่ละตัวจะถูกจัดเก็บเป็นอักขระสองตัว เช่น สตริง "I am a Variable" ค่าซีเรียลไลซ์ที่สร้างขึ้นคือ :s:8:"I am a Variable"; มีความยาว 8 อักขระต่อไปเราจะมุ่งเน้นไปที่การทำให้อนุกรมของตัวแปรอาเรย์
ตัวแปรอาร์เรย์:
$var = array("abc", "def", "xyz", "123");
echo serialize($var);
เอาท์พุต:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz"; i:3;s:3:"123";}
คือค่าสตริงที่ได้รับจากการทำให้อาร์เรย์ $var ของฉันเป็นอนุกรม อาร์เรย์ $var ของเรามีองค์ประกอบสตริง 4 รายการ ได้แก่ "abc", "def" , "xyz", "123" เรามาวิเคราะห์ข้อมูลซีเรียลไลซ์กัน เพื่อความง่าย เราจะแสดงรายการข้อมูลซีเรียลไลซ์ในรูปแบบอาร์เรย์:
a:4:
-
ฉัน:0;s:3:"เอบีซี";
i:1;s:3:"def";
i:2;s:3:"xyz";
ฉัน:3;s:3:"123";
}
การจัดเรียงชัดเจนยิ่งขึ้น ดูที่สตริงเริ่มต้น: a:4:{...} ขั้นแรก อักขระตัวแรก a จะบันทึกประเภทตัวแปร ซึ่งเป็นประเภทอาร์เรย์ (อาร์เรย์) และ 4 ตัวที่สองจะบันทึกองค์ประกอบอาร์เรย์ จำนวน มีทั้งหมด 4 รายการ และเนื้อหาขององค์ประกอบอาร์เรย์ระหว่าง {} ตัวอย่างเช่น องค์ประกอบอาร์เรย์แรก: i:0;s:3:"abc"; i แสดงว่าประเภทค่าดัชนีขององค์ประกอบอาร์เรย์ปัจจุบันเป็นจำนวนเต็ม และค่าคือ 0 และประเภทค่าองค์ประกอบคือ s (สตริง ) ตัวเลขคือ 3 ค่าเฉพาะคือ "abc" ลงท้ายด้วยเครื่องหมายอัฒภาค และอื่นๆ สำหรับองค์ประกอบอาร์เรย์ต่อไปนี้
ลองมาดูว่าจะเกิดอะไรขึ้นถ้าเราใช้สตริงเป็นดัชนีองค์ประกอบ:
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4" = >"123");
echo serialize($var);
เอาท์พุต:
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";}
หลังจากเปลี่ยนเป็นรูปแบบอาร์เรย์:
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";
}
ในความเป็นจริง มันไม่แตกต่างจากข้างต้นมากนัก ยกเว้นว่าดัชนีเริ่มต้นจะเปลี่ยนเป็นรูปแบบของสตริงการบันทึก ตัวอย่างเช่น องค์ประกอบแรก: s:6: "index1"; s:3: "abc"; รายการแรกคือดัชนี ค่า: s:6:"index1"; s คือประเภท 6 คือความยาวของสตริงดัชนี และ "index1" คือค่าของดัชนี s:3:"abc"; เป็นค่าองค์ประกอบที่เข้าใจง่าย ดังนั้นฉันจะไม่ลงรายละเอียด
จากที่กล่าวมาข้างต้น เรามีความเข้าใจทั่วไปเกี่ยวกับการซีเรียลไลซ์ประเภทข้อมูลพื้นฐาน ที่จริงแล้ว เราสามารถสร้างฟังก์ชันซีเรียลไลซ์เซชันของเราเอง หรือขยายจากมุมมองนี้ และพัฒนาโปรแกรมซีเรียลไลเซชันของเราเองเพื่ออำนวยความสะดวกในการแลกเปลี่ยนตัวแปรของเรา
แน่นอนว่า ที่จริงแล้ว เรายังใช้ฟังก์ชันนี้เพื่อทำให้อาร์เรย์หรือตัวแปรอื่นๆ เป็นอนุกรมลงในสตริงได้ จากนั้นใช้ฟังก์ชัน curl เพื่อจำลองฟังก์ชัน GET/POST เพื่อรับข้อมูลจากเซิร์ฟเวอร์ระยะไกลโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ
การทำให้เป็นอนุกรมของวัตถุ
ยังเป็นฟังก์ชันที่ค่อนข้างธรรมดาอีกด้วย โดยสามารถทำให้วัตถุเป็นอนุกรมและแปลงเป็นสตริงซึ่งสามารถบันทึกหรือส่งได้
มาดูตัวอย่างกันก่อน:
คลาส TestClass
-
var $a;
var $b;
ฟังก์ชัน TestClass()
-
$this->a = "นี่คือ";
$this->b = "นี่คือ b";
}
ฟังก์ชัน getA()
-
กลับ $this->a;
}
ฟังก์ชัน getB()
-
กลับ $this->b;
-
}
$obj = TestClass ใหม่;
$str = ทำให้เป็นอนุกรม($obj);
echo $str;
ผลลัพธ์ที่ได้:
O:9:"TestClass":2:{s:1:"a";s:9:"นี่คือ";s:1:"b";s:9:"สิ่งนี้ คือ b";}
มาวิเคราะห์สตริงหลังจากการทำให้เป็นอนุกรมของวัตถุ
O:9:"คลาสทดสอบ":2:
-
s:1:"a";s:9:"นี่คือ";
s:1:"b";s:9:"นี่คือข";
}
ก่อนอื่นให้พิจารณาเนื้อหาของอ็อบเจ็กต์: O:9:"TestClass":2:O ระบุว่านี่คือประเภทอ็อบเจ็กต์ (อ็อบเจ็กต์) จากนั้น 9 แทนชื่อของอ็อบเจ็กต์ และ 2 แทนจำนวนอ็อบเจ็กต์ที่มีอยู่ คุณสมบัติ. เมื่อดูเนื้อหาของแอตทริบิวต์ทั้งสอง:
s:1:"a";s:9:"This is a"; อันที่จริง มันคล้ายกับเนื้อหาของอาร์เรย์แรก: s:1:"a "; คือชื่อแอตทริบิวต์ description รายการที่สอง s:9: "นี่คือ a"; อธิบายค่าแอตทริบิวต์ คุณสมบัติต่อไปนี้จะคล้ายกัน
ก่อนอื่นให้ฉันพูดถึงแอปพลิเคชันการทำให้เป็นอนุกรมของวัตถุ เนื้อหาต่อไปนี้มาจากคู่มือ PHP และข้อความต้นฉบับไม่มีการเปลี่ยนแปลง
serialize() ส่งคืนสตริงที่มีการแสดงสตรีมไบต์ของค่าใด ๆ ที่สามารถเก็บไว้ใน PHP unserialize() สามารถใช้สตริงนี้เพื่อสร้างค่าตัวแปรดั้งเดิมขึ้นมาใหม่ การบันทึกออบเจ็กต์โดยใช้การทำให้เป็นอนุกรมจะบันทึกตัวแปรทั้งหมดในออบเจ็กต์ ฟังก์ชั่นในออบเจ็กต์จะไม่ถูกบันทึก แต่จะบันทึกเฉพาะชื่อของคลาสเท่านั้น
เพื่อให้สามารถยกเลิกการซีเรียลไลซ์ () วัตถุได้ จำเป็นต้องกำหนดคลาสของวัตถุ นั่นคือ ถ้าคุณทำให้วัตถุ $a ของคลาส A เป็นอนุกรมใน page1.php คุณจะได้รับสตริงที่ชี้ไปที่คลาส A และมีค่าของตัวแปรทั้งหมดใน $a หากคุณต้องการดีซีเรียลไลซ์ใน page2.php และสร้างอ็อบเจ็กต์ $a ของคลาส A ใหม่ คำจำกัดความของคลาส A จะต้องปรากฏใน page2.php ซึ่งสามารถทำได้ เช่น โดยการวางคำจำกัดความของคลาส A ในไฟล์รวม และรวมไฟล์นี้ไว้ในทั้ง page1.php และ page2.php
<?php
// classa.inc:
คลาส A
-
var $one = 1;
ฟังก์ชัน show_one()
-
สะท้อน $this->หนึ่ง;
-
}
// page1.php:
รวม("classa.inc");
$a = A ใหม่;
$s = ทำให้เป็นอนุกรม($a);
// เก็บ $s ไว้ที่ใดที่หนึ่งเพื่อให้ page2.php สามารถค้นหามันได้
$fp = fopen("ร้านค้า", "w");
fputs($fp, $s);
fclose($fp);
// page2.php:
// บรรทัดนี้จำเป็นสำหรับการดีซีเรียลไลซ์แบบปกติ
รวม("classa.inc");
$s = ระเบิด("", @file("store"));
$a = unserialize($s);
// ตอนนี้คุณสามารถใช้ฟังก์ชัน show_one() ของ $a object ได้แล้ว
$a->show_one();
?>
หากคุณใช้เซสชันและใช้ session_register() เพื่อลงทะเบียนออบเจ็กต์ ออบเจ็กต์เหล่านี้จะถูกทำให้เป็นอนุกรมโดยอัตโนมัติที่ส่วนท้ายของหน้า PHP แต่ละหน้า และดีซีเรียลไลซ์โดยอัตโนมัติในแต่ละหน้าถัดไป โดยพื้นฐานแล้วหมายความว่าเมื่อออบเจ็กต์เหล่านี้กลายเป็นส่วนหนึ่งของเซสชัน ก็สามารถปรากฏบนหน้าใดก็ได้
ขอแนะนำอย่างยิ่งให้ทุกเพจรวมคำจำกัดความคลาสสำหรับออบเจ็กต์ที่ลงทะเบียนเหล่านี้ แม้ว่าคลาสเหล่านี้จะไม่ได้ใช้ในทุกเพจก็ตาม หากยังไม่เสร็จสิ้น และวัตถุถูกดีซีเรียลไลซ์แต่ไม่ได้กำหนดคลาสไว้ วัตถุนั้นจะสูญเสียคลาสที่เกี่ยวข้องและกลายเป็นอ็อบเจ็กต์ของ stdClass โดยไม่มีฟังก์ชันใดๆ เลย ซึ่งไม่มีประโยชน์อย่างยิ่ง
ดังนั้นหาก $a กลายเป็นส่วนหนึ่งของเซสชันโดยการรัน session_register("a") ในตัวอย่างข้างต้น ไฟล์ classa.inc ควรรวมอยู่ในทุกเพจ ไม่ใช่แค่ page1.php และ page2.php
แน่นอนว่าอ็อบเจ็กต์ซีเรียลไลซ์สามารถนำไปใช้ได้จริงในหลายๆ ที่ แน่นอนว่าการทำให้เป็นอนุกรมได้รับการจัดการแตกต่างออกไปใน PHP 5 ลองมาดูกันว่าคู่มือบอกว่าอย่างไร:
serialize() ตรวจสอบว่ามีฟังก์ชันที่มีชื่อเวทย์มนตร์ __sleep ในคลาสหรือไม่ หากเป็นเช่นนั้น ฟังก์ชันจะทำงานก่อนที่จะทำให้เป็นอนุกรม จะล้างวัตถุและควรส่งคืนอาร์เรย์ที่มีชื่อของตัวแปรทั้งหมดในวัตถุที่ควรทำให้เป็นอนุกรม
วัตถุประสงค์ของการใช้ __sleep คือการปิดการเชื่อมต่อฐานข้อมูลที่ออบเจ็กต์อาจมี ส่งข้อมูลที่ค้างอยู่ หรือดำเนินการล้างข้อมูลที่คล้ายกัน นอกจากนี้ ฟังก์ชันนี้ยังมีประโยชน์หากคุณมีวัตถุที่มีขนาดใหญ่มากซึ่งไม่จำเป็นต้องจัดเก็บทั้งหมด
ในทางกลับกัน unserialize() จะตรวจสอบการมีอยู่ของฟังก์ชันที่มีชื่อเวทย์มนตร์ __wakeup ฟังก์ชันนี้สามารถสร้างทรัพยากรใดๆ ที่วัตถุอาจมีขึ้นใหม่ได้ ถ้ามี
วัตถุประสงค์ของการใช้ __wakeup คือการสร้างการเชื่อมต่อฐานข้อมูลใดๆ ที่อาจสูญหายไปในระหว่างการทำให้เป็นอนุกรมอีกครั้ง และเพื่อจัดการกับงานการเริ่มต้นใหม่อื่นๆ