บทนำ
ใน PHP , อาร์กิวเมนต์ให้ฟังก์ชันสามารถส่งแบบค่า (pass by value) หรือส่งแบบอ้างอิง (pass by reference) ได้ โดยค่าเริ่มต้น ค่าของ actual arguments ถูกส่งแบบค่าให้ formal arguments ซึ่งกลายเป็นตัวแปรท้องถิ่นภายในฟังก์ชัน ดังนั้น การแก้ไขตัวแปรเหล่านี้ไม่เปลี่ยนค่าตัวแปร actual argument
เมื่อส่งอาร์กิวเมนต์แบบอ้างอิง การเปลี่ยนแปลงค่าของ formal argument จะสะท้อนในตัวแปร actual argument เพราะตัวแรกเป็นอ้างอิงถึงตัวหลัง กลไก pass by reference ช่วยในการจัดการข้อมูลใน global space แบบไม่ตรงไปตรงมา และช่วยแก้ข้อจำกัดที่ฟังก์ชันคืนค่าได้เพียงตัวแปรเดียว
การส่งแบบค่า (Pass by Value)
ในตัวอย่างต่อไปนี้ สองตัวแปรถูกส่งให้ฟังก์ชัน swap() แม้กลไกการสลับจะเกิดขึ้นภายในฟังก์ชัน แต่ไม่เปลี่ยนค่าตัวแปรที่ส่ง:
ตัวอย่าง
<?php function swap($arg1, $arg2){ echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n"; $temp=$arg1; $arg1=$arg2; $arg2=$temp; echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>
ผลลัพธ์
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=10 arg2=20
การส่งแบบอ้างอิง (Pass by reference)
เพื่อรับอาร์กิวเมนต์แบบอ้างอิง ตัวแปรที่ใช้เป็น formal argument ต้องนำหน้าด้วยสัญลักษณ์ & มันทำให้เป็นอ้างอิงถึงตัวแปรที่ใช้เรียกฟังก์ชัน ดังนั้น ผลการสลับภายในฟังก์ชันจะสะท้อนในตัวแปรต้นทางที่ส่ง
ตัวอย่าง
<?php function swap(&$arg1, &$arg2){ echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n"; $temp=$arg1; $arg1=$arg2; $arg2=$temp; echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>
ผลลัพธ์
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=20 arg2=10
ในตัวอย่างต่อไปนี้ องค์ประกอบอาร์เรย์เป็นอ้างอิงถึงตัวแปรแต่ละตัวที่ประกาศก่อนการเริ่มต้นอาร์เรย์ หากองค์ประกอบถูกแก้ไข ค่าของตัวแปรก็จะเปลี่ยน:
ตัวอย่าง
<?php $a = 10; $b = 20; $c=30; $arr = array(&$a, &$b, &$c); for ($i=0; $i<3; $i++) $arr[$i]++; echo "$a $b $c"; ?>
ผลลัพธ์
11 21 31
ยังสามารถส่งอาร์เรย์แบบอ้างอิงให้ฟังก์ชันได้:
ตัวอย่าง
<?php function arrfunction(&$arr){ for ($i=0;$i<5;$i++) $arr[$i]=$arr[$i]+10; } $arr=[1,2,3,4,5]; arrfunction($arr); foreach ($arr as $i) echo $i . " "; ?>
ผลลัพธ์
11 12 13 14 15
อ็อบเจ็กต์และอ้างอิง (Object and reference)
ใน PHP อ็อบเจ็กต์ถูกส่งแบบอ้างอิงโดยค่าเริ่มต้น เมื่อสร้างอ้างอิงของอ็อบเจ็กต์ อ้างอิงของมันก็จะถูกส่งเป็นอาร์กิวเมนต์ในรูปของ $this ซึ่งก็เป็นอ้างอิงถึงอ็อบเจ็กต์แรก
ตัวอย่าง
<?php class test1{ private $name; function getname(){ return $this->name; } function setname($name){ $this->name=$name; } } $obj1=new test1(); $obj2=&$obj1; $obj1->setname("Amar"); echo "name: " .$obj2->getname(); ?>
ผลลัพธ์
name: Amar