บทนำ
ฟังก์ชันใน PHP สามารถกำหนดให้รับอินพุตจากสภาพแวดล้อม/สคริปต์ที่เรียกในรูปแบบอาร์กิวเมนต์ อาร์กิวเมนต์เหล่านี้ให้เป็นรายการคั่นด้วยจุลภาคภายในวงเล็บหน้าชื่อฟังก์ชัน โปรดทราบว่า ขณะเรียกฟังก์ชัน ต้องส่งอาร์กิวเมนต์จำนวนเท่าเดิม
PHP รองรับการเรียกฟังก์ชันโดยส่งค่า (pass by value), ส่งอ้างอิง (pass by reference), อาร์กิวเมนต์พร้อมค่าเริ่มต้น และส่งจำนวนอาร์กิวเมนต์แปรผัน
ฟังก์ชันพร้อมอาร์กิวเมนต์
ในตัวอย่างต่อไปนี้ ฟังก์ชันถูกกำหนดพร้อมอาร์กิวเมนต์ทางการสองตัว เมื่อเรียกฟังก์ชันนี้โดยส่งอาร์กิวเมนต์แบบค่า (by value) อาร์กิวเมนต์ของฟังก์ชันจะกลายเป็นตัวแปรท้องถิ่น (local variables) ดังนั้น การเปลี่ยนแปลงค่าอาร์กิวเมนต์ภายในฟังก์ชันไม่สะท้อนกลับไปนอกฟังก์ชัน
ที่นี่ ค่าของ $x ถูกเปลี่ยนภายในฟังก์ชัน แต่ถ้าตรวจสอบค่าหลังเรียกฟังก์ชัน จะไม่เปลี่ยนแปลง:
ตัวอย่าง
<?php function add($x, $y){ $x= $x+$y ; echo $x . "\n"; } $x=10; $y=20; add($x,$y); //นอกฟังก์ชัน $x มีค่าเดิม echo $x; ?>
ผลลัพธ์
30 10
การส่งอาร์เรย์ให้ฟังก์ชัน (Passing array to function)
ในตัวอย่างต่อไปนี้ ฟังก์ชัน add() ถูกกำหนดให้รับอาร์เรย์เป็นอาร์กิวเมนต์ ภายในฟังก์ชัน องค์ประกอบอาร์เรย์ถูกเดินทางด้วย foreach loop:
ตัวอย่าง
<?php function add($arr){ $sum=0; foreach ($arr as $i){ $sum+=$i; } echo "sum = ".$sum; } add(array(1,2,3)); ?>
ผลลัพธ์
sum = 6
การส่งอาร์กิวเมนต์แบบอ้างอิง (Passing arguments by reference)
ค่าถูกส่งให้อาร์กิวเมนต์ของฟังก์ชันแบบค่า (by value) ดังนั้น การเปลี่ยนแปลงค่าอาร์กิวเมนต์ภายในฟังก์ชันไม่สะท้อนกลับนอกฟังก์ชัน เมื่อส่งอาร์กิวเมนต์แบบอ้างอิง (by reference) การเปลี่ยนแปลงค่าอาร์กิวเมนต์ทางการจะสะท้อนในตัวแปรอาร์กิวเมนต์จริง เพราะตัวแรกเป็นอ้างอิงถึงตัวหลัง ดังนั้นกลไก pass by reference ช่วยในการจัดการข้อมูลใน global space อย่างไม่ตรงไปตรงมา และช่วยแก้ข้อเท็จจริงที่ว่าฟังก์ชันคืนค่าได้เพียงตัวแปรเดียว
เพื่อรับค่าแบบอ้างอิง ชื่ออาร์กิวเมนต์ต้องนำหน้าด้วยสัญลักษณ์ $
ตัวอย่าง
<?php function swap(&$x, &$y){ $t=$x; $x=$y; $y=$t; echo "inside function x=$x y=$y\n"; } $x=5; $y=7; echo "before calling function x=$x y=$y\n"; swap($x, $y); echo "after calling function x=$x y=$y\n"; ?>
ผลลัพธ์
before calling function x=5 y=7 inside function x=7 y=5 after calling function x=7 y=5
ค่าของตัวแปร $x และ $y ถูกสลับในฟังก์ชัน swap() เนื่องจากตัวแปรถูกส่งแบบอ้างอิง ตัวแปรจึงแสดงค่าที่ปรับเปลี่ยนแล้วนอกฟังก์ชันด้วย
Type hints (การประกาศชนิด)
PHP จริงๆ เป็นภาษาที่กำหนดชนิดแบบไดนามิก (dynamically typed) ดังนั้น จำเป็นต้องประกาศตัวแปรพร้อมชนิด (เหมือน C/C++ หรือ Java) อย่างไรก็ตาม การประกาศชนิดของอาร์กิวเมนต์ในฟังก์ชัน ทำให้ parser ตรวจจับชนิดข้อมูลที่ไม่ถูกต้องที่ส่งให้ฟังก์ชันได้
รูปแบบไวยากรณ์
//กำหนดฟังก์ชันพร้อม type hints function myfunction(type $arg1, type $arg2){ .. .. }
ชนิดข้อมูล PHP มาตรฐานทั้งหมด รวมถึงชนิดสเกลาร์ อาร์เรย์ คลาส/อินเตอร์เฟซ iterable และ object เป็นชนิดที่ถูกต้องสำหรับการให้ type hints ในการประกาศฟังก์ชัน
ตัวอย่าง
<?php function add(...$numbers){ $ttl=0; foreach ($numbers as $num){ $ttl=$ttl+$num; } return $ttl; } $total=add(10,15,20); echo "total= $total\n"; echo "total=". add(1,2,3,4,5). "\n"; ?>
ผลลัพธ์
total= 45 total=15
ยังสามารถรับรายการอาร์กิวเมนต์ที่ส่งให้ฟังก์ชันได้ด้วยฟังก์ชัน func_get_args() สามารถรันลูป PHP เพื่อเดินทางแต่ละค่าในรายการอาร์กิวเมนต์ที่ส่ง ในกรณีนี้ การกำหนดฟังก์ชันไม่มีอาร์กิวเมนต์ทางการ
ตัวอย่าง
<?php function add (int $x, int $y){ $z=$x+$y; echo "addition=$z\n"; } add(10,20); add(5.55, 6.66); ?>
ผลลัพธ์
addition=30 addition=11
สังเกตว่าในการเรียก add() ครั้งที่สอง ให้ float เป็นอาร์กิวเมนต์ แต่ยังไม่แสดงข้อผิดพลาด/เตือน เนื่องจาก PHP แปลง float เป็นจำนวนเต็มภายในเพื่อทำการบวก เพื่อป้องกันการแปลงชนิดอัตโนมัติแบบนี้ ใช้ construct declare พร้อม strict_types=1
ตัวอย่าง
<?php declare(strict_types=1); function add (int $x, int $y){ $z=$x+$y; echo "addition=$z\n"; } add(10,20); add(5.55, 6.66); ?>
การเรียก add() ครั้งที่สองจะโยน exception:
ผลลัพธ์
addition=30 PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given