ฟังก์ชัน: Variable Scope (Global vs. Local)
ในบทเรียนนี้ เราจะมาทำความเข้าใจเรื่องของ Variable Scope หรือ ขอบเขตของตัวแปร ใน PHP ซึ่งเป็นสิ่งสำคัญอย่างยิ่งในการเขียนโปรแกรมที่มีประสิทธิภาพและหลีกเลี่ยงข้อผิดพลาดที่ไม่คาดฝัน Scope กำหนดว่าตัวแปรใดสามารถเข้าถึงได้จากส่วนใดของโค้ด
ความแตกต่างระหว่าง Global และ Local Scope
ใน PHP ตัวแปรสามารถมีขอบเขตได้สองแบบหลักๆ คือ:
- Global Scope: ตัวแปรที่ประกาศไว้นอกฟังก์ชัน จะมีขอบเขตเป็น Global นั่นคือสามารถเข้าถึงได้จากทุกส่วนของสคริปต์ ยกเว้นภายในฟังก์ชันโดยตรง (เว้นแต่จะมีการระบุเป็นพิเศษ)
- Local Scope: ตัวแปรที่ประกาศไว้ภายในฟังก์ชัน จะมีขอบเขตเป็น Local นั่นคือสามารถเข้าถึงได้เฉพาะภายในฟังก์ชันนั้นๆ เท่านั้น
ลองดูตัวอย่างเพื่อให้เห็นภาพชัดเจนยิ่งขึ้น:
<?php
$global_variable = "Hello, Global World!"; // ตัวแปร Global
function myFunction() {
$local_variable = "Hello, Local World!"; // ตัวแปร Local
echo "ภายในฟังก์ชัน: " . $local_variable . "<br>";
echo "ภายในฟังก์ชัน (พยายามเข้าถึง Global): " . $global_variable . "<br>"; // จะไม่แสดงผลค่าของ $global_variable
}
myFunction();
echo "ภายนอกฟังก์ชัน: " . $global_variable . "<br>";
echo "ภายนอกฟังก์ชัน (พยายามเข้าถึง Local): " . $local_variable . "<br>"; // จะเกิด Error: Undefined variable
?>
จากตัวอย่างข้างต้น:
$global_variableถูกประกาศไว้นอกฟังก์ชันmyFunction()ดังนั้นจึงเป็นตัวแปร Global$local_variableถูกประกาศไว้ภายในฟังก์ชันmyFunction()ดังนั้นจึงเป็นตัวแปร Local- เมื่อเราพยายามเข้าถึง
$global_variableภายในฟังก์ชันmyFunction()PHP จะไม่สามารถเข้าถึงได้โดยตรง (จะแสดงผลเป็นค่าว่างหรือเกิด Warning ขึ้นอยู่กับการตั้งค่า PHP) - เมื่อเราพยายามเข้าถึง
$local_variableภายนอกฟังก์ชันmyFunction()จะเกิด Error เนื่องจากตัวแปรนั้นมีขอบเขตเฉพาะภายในฟังก์ชัน
การใช้ Keyword 'global' เพื่อเข้าถึงตัวแปร Global ภายในฟังก์ชัน
หากเราต้องการเข้าถึงตัวแปร Global ภายในฟังก์ชัน เราสามารถใช้ keyword global เพื่อบอกให้ PHP ทราบว่าเราต้องการอ้างอิงถึงตัวแปร Global นั้น:
<?php
$global_variable = "Hello, Global World!";
function myFunction() {
global $global_variable; // ประกาศว่าต้องการใช้ตัวแปร Global ชื่อ $global_variable
echo "ภายในฟังก์ชัน (เข้าถึง Global ด้วย keyword 'global'): " . $global_variable . "<br>";
$global_variable = "Global variable has been changed inside function!"; // เปลี่ยนค่าตัวแปร Global
}
myFunction();
echo "ภายนอกฟังก์ชัน (หลังจากเรียกฟังก์ชัน): " . $global_variable . "<br>";
?>
จากตัวอย่างนี้:
- เราใช้
global $global_variable;ภายในฟังก์ชันmyFunction()เพื่อบอกให้ PHP ทราบว่าเราต้องการใช้ตัวแปร Global ที่ชื่อ$global_variable - เมื่อเราเปลี่ยนค่าของ
$global_variableภายในฟังก์ชัน การเปลี่ยนแปลงนั้นจะมีผลต่อตัวแปร Global จริงๆ
ข้อควรระวัง: การใช้ global มากเกินไป อาจทำให้โค้ดอ่านยากและบำรุงรักษายากขึ้น ควรพิจารณาการส่งค่าตัวแปรเป็น Argument ให้กับฟังก์ชันแทน หากเป็นไปได้
การใช้ Keyword 'static' เพื่อเก็บค่าตัวแปร Local ระหว่างการเรียกฟังก์ชัน
โดยปกติแล้ว เมื่อฟังก์ชันทำงานเสร็จสิ้น ตัวแปร Local ทั้งหมดที่สร้างขึ้นภายในฟังก์ชันจะถูกทำลาย แต่หากเราต้องการเก็บค่าของตัวแปร Local ไว้สำหรับการเรียกฟังก์ชันครั้งถัดไป เราสามารถใช้ keyword static:
<?php
function myFunction() {
static $counter = 0; // ตัวแปร Static Local
$counter++;
echo "ฟังก์ชันถูกเรียก " . $counter . " ครั้ง<br>";
}
myFunction(); // ฟังก์ชันถูกเรียก 1 ครั้ง
myFunction(); // ฟังก์ชันถูกเรียก 2 ครั้ง
myFunction(); // ฟังก์ชันถูกเรียก 3 ครั้ง
?>
จากตัวอย่างนี้:
$counterถูกประกาศเป็นstaticดังนั้นค่าของมันจะถูกเก็บไว้ระหว่างการเรียกฟังก์ชันแต่ละครั้ง- เมื่อฟังก์ชัน
myFunction()ถูกเรียก ค่าของ$counterจะเพิ่มขึ้นเรื่อยๆ
ประโยชน์ของ Static Variables:
- ใช้ในการนับจำนวนครั้งที่ฟังก์ชันถูกเรียก
- ใช้ในการเก็บค่า state ของฟังก์ชัน
- ใช้ในการสร้าง Singleton Pattern (ใน OOP)
สรุป
ในบทเรียนนี้ เราได้เรียนรู้เกี่ยวกับ:
- ความแตกต่างระหว่าง Global และ Local Scope
- การใช้ keyword
globalเพื่อเข้าถึงตัวแปร Global ภายในฟังก์ชัน - การใช้ keyword
staticเพื่อเก็บค่าตัวแปร Local ระหว่างการเรียกฟังก์ชัน
การทำความเข้าใจเรื่อง Variable Scope เป็นสิ่งสำคัญในการเขียนโปรแกรม PHP ที่มีประสิทธิภาพและหลีกเลี่ยงข้อผิดพลาด ควรฝึกฝนการใช้งาน Global และ Static Variables อย่างระมัดระวัง เพื่อให้โค้ดมีความชัดเจนและบำรุงรักษาง่าย