วันพุธที่ 26 พฤศจิกายน พ.ศ. 2557

การเขียนฟังก์ชัน

หลักการเขียนฟังก์ชัน

รูปแบบ


function ชื่อฟังก์ชัน([ตัวแปรที่ใช้ถ้ามี]) {
โค้ด PHP ตามสะดวก
}
ตัวอย่างฟังก์ชันง่ายๆ แบบมาตรฐาน

<?php
function HelloWorld() {
echo "Hello World!";
}
HellowWorld();
?>
เมื่อรันโค้ดนี้แล้ว ผลลัพธ์ที่ได้ก็คือ หน้าจอบราวเซอร์จะแสดงคำว่า Hello World! นั่นเองครับ... จากตรงนี้สรุปการใช้งานฟังก์ชันที่เราเขียนขึ้นมาเองเบื้องต้นให้ทราบดังนี้ก่อน (และจะกล่าวถึงลึกๆ ต่อไปในภายหลัง)
  • ชื่อของฟังก์ชัน จะเป็นอะไรก็ได้ จะประกอบไปด้วยตัวอักษรใหญ่ หรือเล็กก็ได้ ไม่ควรยาวมาก เพราะจะทำให้จำยาก และควรอ่านแล้วบ่งชี้ถึงหน้าที่ของฟังก์ชันนั้นๆ และมีชื่อไม่ซ้ำกับชื่อฟังก์ชันเดิม ที่ PHP มีอยู่แล้ว
  • เวลาเรียกใช้ฟังก์ชัน ก็ให้พิมพ์ชื่อของฟังก์ชันนั้นให้ถูกต้อง ตัวเล็ก ตัวใหญ่ ต้องตรงกันเป๊ะๆ ด้วย
เอาละ ทีนี้มาดูอะไรต่ออีกหน่อย
<?php
function easyCal($a, $b) {
$c = $a + $b;
echo $c;
}
easyCal(5, 3);
?>
พอเรารันโค้ดนี้แล้ว ที่เราจะได้ก็คือ ผลลัพธ์ของ 5 + 3 ซึ่งก็คือ 8 นั่นเองครับ... จากตรงนี้เราก็สามารถสรุปเพิ่มเติมได้ว่า
  • เราสามารถให้ฟังก์ชันที่เขียนขึ้น รับค่าไปทำการประมวลผลได้ โดยการกำหนดตัวแปรเอาไว้ตอนประกาศฟังก์ชัน และป้อนค่าของตัวแปรให้กับฟังก์ชัน ตอนเรียกใช้
     ตัวอย่างที่ให้เห็นไปนั้น สังเกตได้ว่าจะเป็นการแสดงค่าผลของการประมวลผลมาเสร็จสรรพเลยครับ แต่มีบ่อยครั้งที่เราต้องการเอาค่าที่ประมวลผลได้ ไปคำนวณต่อ แต่ว่าไอ้ส่วนที่เราเอาไปคำนวณต่อนั้น ในแต่ละไฟล์ของเว็บแอปพลิเคชันของเรา ไม่เหมือนกัน ดังนั้นจึงไม่สามารถเอาไปรวมไว้ในฟังก์ชันได้ เราจะทำยังไง?!?
คำตอบก็คือ ให้ฟังก์ชันทำการประมวลผล ให้ได้ผลลัพธ์ แล้วทำการคืนค่า (return) ออกมา เอาไว้ใช้ประมวลผลต่อนั่นเอง...
เช่น สมมติว่าเราอยากได้ฟังก์ชันสำหรับประมวลผล factorial ของค่าใดๆ (n!)... เอ่อ... ใครที่ไม่ได้เรียนเลข หรือเกลียดเลขสุดๆ (เช่นผมเป็นต้น) เกิดสงสัยว่า factorial ของค่า n คืออะไร ขออธิบายแบบนี้นะครับ... สมมติเราบอกว่า factorial ของ 3 หรือ 3! เราจะหมายถึงค่าของ 3 x 2 x 1 หรือเท่ากับ 6 นั่นเอง หรือถ้าเราบอกว่า factorial ของ 9 หรือ 9! ก็จะหมายถึงค่าของ 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 หรือ 362,880 นั่นเอง พูดง่ายๆ ค่าของ n! ก็คือ n x (n - 1) x (n - 2) x (n - 3)... x 1 ครับ
เอาละ ทีนี้ลองมาเขียนฟังก์ชันสำหรับการหาค่า factorial ของ n กันดีกว่า เมื่อ n คือค่าใดๆ ที่เราต้องการทราบค่า factorial ของมัน

<?php
function factorial($n) {
$result = 1;
for ($i = 0; $i < $n; $i++) {
$result = $result * ($n - $i);
}
return $result;
}
$n = factorial(9);
echo $n;
?>
ทีนี้พอเรารันผลโค้ดนี้ เราก็จะได้ค่าเป็น 362880 หรือ ผลลัพธ์ของ 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 หรือ 9! นั่นเองครับ... จากตรงนี้ขอสรุปเพิ่มเติมก่อนจะจากกันในวันนี้ดังนี้
  • การคืนค่าจากฟังก์ชัน ไม่ยากเลยครับ แค่ปิดท้ายด้วย return ชื่อตัวแปรที่ต้องการคืนค่า เท่านั้นเอง... แต่มีข้อแม้ว่า สามารถ return ค่าได้เพียงค่าเดียวเท่านั้นครับ... ขอให้ดูโค้ดต่อไปนี้ประกอบ
<?php
function test1() {
$a = "ข้อความที่ 1";
$b = "
ข้อความที่ 2";
return $a;
return $b;
}
function test2() {
$a = "ข้อความที่ 1";
$b = "
ข้อความที่ 2";
return $b;
return $a;
}
echo test1(). "<br>";
echo test2();
?>
ผลลัพธ์ที่ได้คือ
ข้อความที่ 1
ข้อความที่ 2
นั่นเอง... พูดง่ายๆ คือ เรา return ค่าไหนก่อน เราก็จะได้ค่านั้นออกมาครับ
  • เวลาเราจะเอาค่าไปใช้งาน เราเลือกได้ 2 แบบครับดังนี้ (ดูโค้ดประกอบอีกแล้ว)
<?php
function easyCal($a, $b) {
$c = $a + $b;
return $c;
}
$result = easyCal(5, 3);
echo $result. "<br>"; //
เรียกใช้วิธีที่ 1
echo easyCal(5, 3); //
เรียกใช้วิธีที่ 2
?>
ผลลัพธ์ที่ได้ ก็คือ 8 เท่ากัน... แต่ถามว่าเวลาใช้งานจริง ขอให้ใช้แบบไหน?!? อันนี้ต้องดูสถานการณ์คือ หากเราต้องการจะใช้ผลลัพธ์ที่ได้ หลายครั้งในไฟล์เดียวกัน เราควรสละหน่วยความจำของเซิร์ฟเวอร์ซักนิด เพื่อเก็บผลลัพธ์ที่ได้จากฟังก์ชันเอาไว้ในตัวแปร เพื่อนำไปใช้ต่อไป การเรียกใช้แบบที่ 2 นั้น ทุกครั้งที่เรียกใช้ เท่ากับว่าเซิร์ฟเวอร์ต้องทำการประมวลผลฟังก์ชันใหม่เสมอ ซึ่งคงไม่ดีแน่ๆ หากต้องทำเช่นนี้บ่อยๆ กับฟังก์ชันที่ใช้เวลาประมวลผลนานๆ... แต่หากเราต้องการใช้ครั้งเดียวจบ ก็ใช้วิธีที่ 2 ได้ ไม่ผิดอะไร ดีซะอีก ไม่เปลืองหน่วยความจำ
  • ตัวแปรที่ใช้ในฟังก์ชัน กับตัวแปรที่อยู่นอกฟังก์ชัน แม้จะชื่อเดียวกัน แต่ถือว่าเป็นตัวแปรคนละตัว... เว้นเสียแต่จะมีการประกาศให้ตัวแปรนั้นๆ เป็นตัวแปรประเภท global ครับ
<?php
$a = 5;
function test() {
$a = 20;
echo "
ค่า $a ในฟังก์ชัน test() คือ ". $a;
}
function test2() {
global $a;
$a = 30;
echo "
ค่า $a ในฟังก์ชัน test2() หลังประกาศตัวแปร $a เป็น global แล้วคือ ". $a;
}
echo "ค่า $a นอกฟังก์ชันคือ ". $a. "<br>";
echo test(). "<br>";
echo "
ค่า $a หลังจากรันฟังก์ชัน test() คือ ". $a. "<br>";
echo test2(). "<br>";
echo "
ค่า $a หลังจากรันฟังก์ชัน test2() คือ ". $a;
?>
พอเรารันโค้ดแล้ว ผลลัพธ์ที่ได้ก็คือ
ค่า $a นอกฟังก์ชันคือ 5
ค่า $a ในฟังก์ชัน test() คือ 20
ค่า $a หลังจากรันฟังก์ชัน test() คือ 5
ค่า $a ในฟังก์ชัน test2() หลังประกาศตัวแปร $a เป็น global แล้วคือ 30
ค่า $a หลังจากรันฟังก์ชัน test2() คือ 30
สังเกตอะไรไหมครับ?!?
  • ก่อนประกาศตัวแปร $a เป็นตัวแปรประเภท global ค่าของ $a นอกฟังก์ชัน test() กับค่าของ $a ในฟังก์ชัน test() ถือเป็นคนละตัวกัน ดังนั้นก่อน และหลังของการรันฟังก์ชัน test() ค่าของ $a จึงยังคงเป็น 5 เช่นเดิม โดยไม่สนว่าตอนเรียกฟังก์ชัน test() นั้น จะมีการกำหนดตัวแปร $a ให้เป็นค่าอะไรก็ตาม
  • แต่พอประกาศตัวแปร $a เป็นตัวแปรประเภท global แล้ว ค่าของ $a นอกฟังก์ชัน เลยเปลี่ยนไปเป็น 30 หลังทำการรันฟังก์ชัน test2() ทั้งนี้เพราะว่า ในฟังก์ชัน test2() นั้น ได้มีการกำหนดค่า $a เสียใหม่เป็น 30 นั่นเอง
  • เราจะประกาศตัวแปรกี่ตัวให้เป็น global ก็ได้โดยใช้เครื่องหมาย , คั่น เช่น global $a, $b, $c; เป็นต้น





ที่มา:http://www.thaimisc.com/r/view.php?id=442

ไม่มีความคิดเห็น:

แสดงความคิดเห็น