บทนำ
PHP มีฟังก์ชันในตัว (built-in functions) จำนวนมาก เช่น ฟังก์ชันคณิตศาสตร์ สตริง วันที่ อาร์เรย์ ฯลฯ ยังสามารถกำหนดฟังก์ชันตามความต้องการเฉพาะได้ ฟังก์ชันแบบนี้เรียกว่า user defined function
ฟังก์ชันคือบล็อกคำสั่งที่ใช้ซ้ำได้ ทำงานเฉพาะเจาะจง บล็อกนี้ถูกกำหนดด้วยคีย์เวิร์ด function และให้ชื่อที่ขึ้นต้นด้วยตัวอักษรหรือ underscore ฟังก์ชันนี้อาจถูกเรียกจากที่ใดในโปรแกรมก็ได้ จำนวนครั้งเท่าไรก็ได้
รูปแบบไวยากรณ์
//กำหนดฟังก์ชัน function myfunction($arg1, $arg2, ... $argn) { statement1; statement2; .. .. return $val; } //เรียกฟังก์ชัน $ret=myfunction($arg1, $arg2, ... $argn);
ฟังก์ชันอาจกำหนดพร้อมอาร์กิวเมนต์เพิ่มเติม (optional) จำนวนเท่าไหร่ก็ได้ อย่างไรก็ตาม ต้องส่งอาร์กิวเมนต์จำนวนเท่าเดิมขณะเรียก บอดี้ฟังก์ชันสามารถมีโค้ด PHP ที่ถูกต้องใดๆ ได้ เช่น เงื่อนไข ลูป ฯลฯ (แม้แต่ฟังก์ชันหรือคลาสอื่นอาจถูกกำหนดภายในฟังก์ชันได้) หลังดำเนินคำสั่งในบล็อก ควบคุมโปรแกรมกลับไปที่ตำแหน่งที่เรียก ไม่ว่าจะมีคำสั่งสุดท้ายเป็น return หรือไม่ นิพจน์หน้า return statement จะคืนค่าให้สภาพแวดล้อมที่เรียก
ตัวอย่าง user defined function
ตัวอย่างต่อไปนี้แสดงการกำหนดและเรียกฟังก์ชันที่ผู้ใช้กำหนดเอง sayhello():
ตัวอย่าง
<?php //function definition function sayHello(){ echo "Hello World!"; } //function call sayHello(); ?>
สคริปต์นี้จะให้ผลลัพธ์ดังนี้เมื่อรันจากบรรทัดคำสั่ง:
ผลลัพธ์
Hello World!
ฟังก์ชันพร้อมอาร์กิวเมนต์
ในตัวอย่างต่อไปนี้ ฟังก์ชันถูกกำหนดพร้อมอาร์กิวเมนต์ทางการสองตัว:
ตัวอย่าง
<?php function add($arg1, $arg2){ echo $arg1+$arg2 . "\n"; } add(10,20); add("Hello", "World"); ?>
ผลลัพธ์
30 PHP Warning: A non-numeric value encountered in line 3
ในการเรียกครั้งที่สอง ให้ค่าสตริงสองค่าเป็นอาร์กิวเมนต์ฟังก์ชัน เนื่องจาก PHP ไม่รองรับตัวดำเนินการ + สำหรับสตริง จึงมีการแจ้งเตือน
การคืนค่าของฟังก์ชัน (function return)
User defined function ในตัวอย่างต่อไปนี้ประมวลผลอาร์กิวเมนต์ที่ให้มาและคืนค่าให้สภาพแวดล้อมที่เรียก:
ตัวอย่าง
<?php function add($arg1, $arg2){ return $arg1+$arg2; } $val=add(10,20); echo "addition:". $val. "\n"; $val=add("10","20"); echo "addition: $val"; ?>
ผลลัพธ์
addition:30 addition:30
ในการเรียกครั้งที่สอง แม้อาร์กิวเมนต์จะเป็นสตริง PHP จะบังคับ (coerce) ให้เป็นจำนวนเต็มและทำการบวก
ฟังก์ชันพร้อมค่าเริ่มต้นของอาร์กิวเมนต์ (default argument value)
ขณะกำหนดฟังก์ชัน อาจมอบหมายค่าเริ่มต้นของอาร์กิวเมนต์ ถ้าไม่ได้มอบหมายค่าให้อาร์กิวเมนต์ดังกล่าวขณะเรียกฟังก์ชัน ค่าเริ่มต้นนี้จะถูกใช้ในการประมวลผลภายในฟังก์ชัน ในตัวอย่างต่อไปนี้ ฟังก์ชันถูกกำหนดพร้อมอาร์กิวเมนต์ที่มีค่าเริ่มต้น:
ตัวอย่าง
<?php function welcome($user="Guest"){ echo "Hello $user\n"; } //ทับค่าเริ่มต้น welcome("admin"); //ใช้ค่าเริ่มต้น welcome(); ?>
ผลลัพธ์
Hello admin Hello Guest
ในการเรียกครั้งที่สอง ฟังก์ชันถูกเรียกโดยไม่ส่งค่า ในกรณีนี้ อาร์กิวเมนต์ user จะใช้ค่าเริ่มต้น
ฟังก์ชันพร้อมจำนวนอาร์กิวเมนต์แปรผัน (variable number of arguments)
สามารถกำหนดฟังก์ชันที่รับจำนวนอาร์กิวเมนต์แปรผันได้ ชื่ออาร์กิวเมนต์ทางการในการกำหนดฟังก์ชันนำหน้าด้วย token ... ตัวอย่างต่อไปนี้มีฟังก์ชัน add() ที่บวกเลขรายการที่ให้มาเป็นอาร์กิวเมนต์:
ตัวอย่าง
<?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(){ $numbers=func_get_args(); $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
ฟังก์ชันภายในฟังก์ชันอีกฟังก์ชัน (function within another function)
ฟังก์ชันอาจถูกกำหนดภายในบอดี้ของอีกฟังก์ชัน อย่างไรก็ตาม ฟังก์ชันภายในไม่สามารถเรียกได้ก่อนที่ฟังก์ชันภายนอกจะถูกเรียกแล้ว
ตัวอย่าง
<?php function hello(){ echo "Hello\n"; function welcome(){ echo "Welcome to TutorialsPoint\n"; } } //welcome(); hello(); welcome(); ?>
ลบคอมเมนต์เพื่อเรียก welcome() ก่อน hello() ข้อความผิดพลาดต่อไปนี้จะหยุดโปรแกรม:
Fatal error: Uncaught Error: Call to undefined function welcome()
ผลลัพธ์
คอมเมนต์บรรทัดนั้นและรันอีกครั้ง:
Hello Welcome to TutorialsPoint
Recursive function (ฟังก์ชันเวียนเกิด)
ฟังก์ชันที่เรียกตัวเองเรียกว่า recursive function การเรียกตัวเองโดยไม่มีเงื่อนไขสร้าง infinite loop และทำให้เกิดข้อผิดพลาด out of memory เนื่องจาก stack เต็ม โปรแกรมต่อไปนี้เรียกฟังก์ชัน factorial() แบบ recursive:
ตัวอย่าง
<?php function factorial($n){ if ($n < 2) { return 1; } else { return ($n * factorial($n-1)); } } echo "factorial(5) = ". factorial(5); ?>
ผลลัพธ์
factorial(5) = 120