แนะนำตัว
ใน PHP, อาร์กิวเมนต์ของฟังก์ชันสามารถส่งผ่านด้วยค่าหรือส่งผ่านโดยการอ้างอิง โดยค่าเริ่มต้น ค่าของอาร์กิวเมนต์จริงจะถูกส่งต่อโดยค่าไปยังอาร์กิวเมนต์ที่เป็นทางการ ซึ่งจะกลายเป็นตัวแปรภายในฟังก์ชัน ดังนั้น การปรับเปลี่ยนตัวแปรเหล่านี้จะไม่เปลี่ยนค่าของตัวแปรอาร์กิวเมนต์จริง
เมื่ออาร์กิวเมนต์ถูกส่งผ่านโดยการอ้างอิง การเปลี่ยนแปลงในค่าของอาร์กิวเมนต์ที่เป็นทางการจะสะท้อนให้เห็นในตัวแปรอาร์กิวเมนต์จริง เนื่องจากอาร์กิวเมนต์แรกคือการอ้างอิงถึงอาร์กิวเมนต์หลัง ดังนั้นการส่งผ่านโดยกลไกอ้างอิงจะช่วยในการจัดการข้อมูลในทางอ้อมในพื้นที่โลก นอกจากนี้ยังช่วยในการเอาชนะความจริงที่ว่าฟังก์ชันสามารถส่งคืนตัวแปรได้เพียงตัวเดียว
ส่งต่อความคุ้มค่า
ในตัวอย่างต่อไปนี้ ตัวแปรสองตัวถูกส่งไปยังฟังก์ชัน 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
ผ่านโดยการอ้างอิง
ในการรับอาร์กิวเมนต์โดยการอ้างอิง ตัวแปรที่ใช้อาร์กิวเมนต์ที่เป็นทางการจะต้องนำหน้าด้วยสัญลักษณ์ &มันทำให้การอ้างอิงถึงตัวแปรที่ใช้สำหรับการเรียกใช้ฟังก์ชัน ดังนั้นผลลัพธ์ของการแลกเปลี่ยนภายในฟังก์ชันก็จะสะท้อนให้เห็นในตัวแปรเดิมที่ผ่าน
ตัวอย่าง
<?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"; ?>
ผลลัพธ์
ค่าของ $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
วัตถุและการอ้างอิง
ใน 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