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

ฟังก์ชันที่ผู้ใช้กำหนดเอง (User-defined Functions) ใน PHP

บทนำ

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