Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

อาร์กิวเมนต์ฟังก์ชัน (Function Arguments) ใน PHP

บทนำ

ฟังก์ชันใน 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