การใช้ Object ใน PHP 4 กับ 5 ต่างกันยังไง ?

การ Initialize Object เพื่อให้ได้ Object ใน PHP 4 นั้นจะเป็นการ Pass-by-Value แต่ใน PHP 5 จะเป็นการ Pass-by-Reference แทน จากโค้ดตัวอย่างด้านล่างนี้

PLAIN TEXT

PHP:

  1. class userClass {

  2. ? ? var $data = ‘Hello’;

  3. ? ? function talk() {

  4. ? ? ? ? echo $this->getData();

  5. ? ? }

  6. ? ? function setData($val){

  7. ? ? ? ? $this->data = $val;

  8. ? ? }

  9. ? ? function getData(){

  10. ? ? ? ? return $this->data;

  11. ? ? }

  12. }

ทำการ Initialize Object โดยกำหนดชื่อ Reference-Name ว่า $obj1

PLAIN TEXT

PHP:

  1. // PHP 5

  2. // Assigned-by-Value Format

  3. // Override operation with Assigned-by-Reference

  4. $obj1 = new userClass();

  5. // PHP 4

  6. // Assigned-by-Value Format

  7. // Used more memory

  8. $obj1 = new userClass();

  9. // PHP 4 same way with PHP 5

  10. // Assigned-by-Reference Format

  11. // E_STRIC Error in PHP 5 and Removed in PHP 6

  12. $obj1 =& new userClass();

PLAIN TEXT

CODE:

  1. $obj1 ——–> [OBJECT DATA]

ในการ Initialize Object ใน PHP 4 นั้น ถ้าใช้แบบทั่วไปใช้ใช้กันคือแบบ Assigned-by-Value นั้น Object ที่ถูกสร้างขึ้นมาตอน Initialize แล้วถูก copy (clone) ไปยังตัวแปรที่เราสร้างขึ้นมา ซึ่งการทำแบบนี้จะเสีย memory เพิ่มขึ้น แต่ถ้าใช้การ Initialize Object แบบ Reference กับตัวแปร object แทนการ copy (clone) ข้อมูลใส่ตัวแปรนั้น โดยต้องใช้การทำ Assigned-by-Reference แทนแบบ Assigned-by-Value โดยที่ Initialize Object เพื่อสร้าง Object จะมีการสร้างบนหน่วยความจำ แล้วมีตัวแปรไป Reference มันเพื่ออ้างอิงค่าแทน

แต่ใน PHP 5 นั้นการ Initialize Object ก็ใช้รูปแบบ Assigned-by-Value ไปเลย แบบเดียวกับ Java ซะ แต่ผลก็จะเป็นการอ้างอิงแบบ Assigned-by-Reference ไปเลยในตัว ซึ่งการทำแบบนี้นั้นรวมไปถึงการทำ Assign-Value, Return-Value และการ Pass-Parameter ด้วย

เมื่อเรานำไปใช้ตามตัวอย่างด้านล่างนี้

PLAIN TEXT

PHP:

  1. $obj1->talk();

  2. $obj2 = $obj1;

  3. $obj1->talk();

  4. $obj2->setData(“Hi”);

  5. $obj1->talk();

ก็จะได้ผลของ PHP 5 คือ

PLAIN TEXT

CODE:

  1. Hello

  2. Hi

โดยการทำงานนั้น $obj1 นั้นจะเรียก Method talk มา แล้วทำการ Assigned-by-Reference ให้กับ $obj2 ทำให้ต่อไปเมื่อใช้งาน $obj2 ก็จะเหมือนกับใช้ $obj1 นั้นเอง (ทั้งการแก้ไข และเรียกใช้) เพราะตัวแปรทั้งสองตัว มันอ้างอิง Memory Address เดียวกัน

PLAIN TEXT

CODE:

  1. $obj1 ——–> [OBJECT DATA]

  2. ? ? ? ? ? |