แนะนำตัว
ใน 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