GORAGOD.com

การบันทึก Object เก็บไว้ใช้งานภายหลัง

บทความนี้เกิดจากข้อสงสัยละครับ ว่าเราจะสามารถบันทึก Object เก็บไว้ใช้งานได้ด้วยวิธีไหน ส่วนจะเอาไปใช้ประโยชน์อะไรได้ก็ค่อยว่ากันอีกที

โค้ดของคลาส test.class.php
class Test
{
    public $property = 1;

    public function run($param)
    {
        echo 'This param is : '.($param + $this->property);
    }
}

โค้ดด้านบนเป็นคลาสที่ใช้ในการทดสอบครับ สังเกตนะครับว่าผมกำหนด property มีค่าเป็น 1 และฟังก์ชั่น run จะมีการบวกค่าที่ส่งเข้าไปด้วย property

โค้ดหน้า index.php ซึ่งเป็นหน้าหลักที่มีการสร้างคลาสในครั้งแรก มีการเรียกใช้เมธอดรัน ได้ผลลัพท์เป็น 2 (มาจาก 1 + property) และมีการกำหนดค่า property เป็นค่าใหม่
// include class
include ('test.class.php');
// Create Object
$obj = new Test;
$obj->run(1); // ผลลัพท์ 2
$obj->property = 2;

// แปลง Object เป็น String
$stored = serialize($obj);

// บันทึก Object เป็นไฟล์
$f = fopen('teststored', 'wb');
fwrite($f, $stored);
fclose($f);

ในการบันทึก Object เป็นไฟล์เราจะต้องแปลง Object เป็น String ก่อนด้วยฟังก์ชั่น serialize() หลังจากนั้นบันทึกเป็นไฟล์ teststored ครับ ถ้าอยากรู้ว่ามันบันทึกอะไรลงไปก็ไปเปิดดูครับ

ทดลองเรียกใช้คลาสที่บันทึกไว้ ขั้นตอนแรกก็ include เอาต้นแบบคลาสเข้ามาก่อน จากนั้นก็ไปอ่านไฟล์และแปลงกลับเป็น Object ด้วย &unserialize() อย่าลืมใส่ & ข้างหน้าฟังก์ชั่นด้วยเพราะเราต้องการผลลัพท์เป็น Object
// include class
include ('test.class.php');

// อ่านไฟล์และแปลงกลับเป็น Object
$obj = &unserialize(file_get_contents('teststored'));
// รัน
$obj->run(1);

ผลการเรียกคำสั่ง run() จะได้ผลลัพท์เป็น 3 เนื่องจากเรามีการแก้ไขค่าของ property เป็น 2 ไปก่อนหน้าที่เราจะบันทึก

แถมให้อีกอัน ลองสร้างลิงค์สำหรับส่ง Object ไปใช้งานที่หน้าอื่น (เช่น test3.php)
echo '<br><a href="test3.php?test='.rawurlencode($stored).'">Send Object</a>';

โค้ดนี้จะอยู่ถัดจากการแปลง String เป็น Object แล้วในหน้า index.php (ตามด้านบน) โดยจะเป็นการส่งค่าตัวแปร $stroed ไปยังหน้าถัดไป

ส่วนโค้ดหน้า test3.php รับค่ามาแล้วประมวลผลต่อ
// include class
include ('test.class.php');

$obj = &unserialize($_GET['test']);
$obj->run(1);

รับค่ามาจาก $_GET และแปลงกลับเป็น Object ด้วย &unserialize() เหมือนเดิม