ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page
มาทำความเข้าใจ isset() และ empty() ว่ามันมีการทำงานและประโยชน์อย่างไร
isset() ใช้เพื่อตรวจสอบว่า "ตัวแปรนั้นๆ ได้ถูกกำหนดขึ้น และมีค่าที่ไม่ใช่ null หรือไม่"
$a = 'Hello World';
$c = null;
$d = false;
isset($a); // true เพราะมีค่าที่ไม่ใช่ null
isset($b); // false เพราะไม่มีตัวแปร $b อยู่
isset($c); // false เพราะมีค่าเป็น null
isset($d); // true เพราะมีค่าที่ไม่ใช่ null
ซึ่งใช้ตรวจสอบเฉพาะตัวแปรเท่านั้น หากใส่อย่างอื่นลงไป จะเกิด Parse error
isset($a); // ตัวแปรเดี่ยวๆ OK
isset($a[0][1][2]); // ตัวแปร array ที่มีการเข้าถึงสมาชิก OK
isset($a + 1); // อันนี้ไม่ใช่ตัวแปร แต่เป็น expression จะทำให้เกิด Parse error
isset(htmlspecialchars($a)); // อันนี้ไม่ใช่ตัวแปร แต่เป็น function call จะทำให้เกิด Parse error
isset($a[1 + 1]); // ตัวแปร array ที่มีการเข้าถึงสมาชิกด้วย expression OK
isset($a[floor(5.5)]); // ตัวแปร array ที่มีการเข้าถึงสมาชิกด้วย function call OK
ส่วน empty() ใช้เพื่อตรวจสอบว่า "ตัวแปรนั้นๆ ยังไม่ได้ถูกกำหนดขึ้น หรือมีค่าที่ว่างเปล่า หรือไม่"
พูดง่ายๆ คือตรวจว่า มีค่าอยู่หรือไม่
ซึ่งรูปแบบของ "ค่าที่ว่างเปล่า" หรือ "ไม่มีค่า" นี้ได้แก่
null
false
0
'' (สตริงว่าง)
'0' (สตริง 0)
array() (array ที่ไม่มีสมาชิกใดๆ อยู่)
empty() นั้นก็เหมือนกับ isset() ใช้ตรวจสอบเฉพาะตัวแปรเท่านั้น
$a = 'Hello World';
$c = '';
$d = array();
empty($a); // false เพราะมีค่าที่ไม่ใช่ค่าที่ว่างเปล่า
empty($b); // true เพราะไม่มีตัวแปร $b อยู่
empty($c); // true เพราะมีค่าเป็นสตริงว่าง
empty($d); // true เพราะมีค่าเป็น array ที่ว่างเปล่า
isset() สามารถตรวจสอบตัวแปรได้ทีละหลายๆ ตัว แต่ empty() ไม่
ซึ่งจะให้ผลเป็นจริงก็ต่อเมื่อ ตัวแปรทุกตัวที่ตรวจสอบนั้นได้ถูกกำหนดขึ้น และมีค่าที่ไม่ใช่ null
$a = 1;
$b = 2;
$c = 3;
isset($a, $b, $c); // true เพราะทุกตัวมีค่าที่ไม่ใช่ null
isset($a, $b, $c, $d); // false เพราะ $d ยังไม่ถูกกำหนดขึ้น
$c = null;
isset($a, $b, $c); // false เพราะ $c เป็น null
empty($a, $b, $c); // Parse error เพราะ empty() ตรวจตัวแปรได้ทีละตัว
นอกจากการใช้เพื่อประโยชน์ข้างต้นแล้ว จะใช้เพื่ออะไรได้อีก และทำไมถึงควรใช้?
โดยปกติการเขียนโปรแกรมเพื่อเก็บสถานะจริงเท็จ เพื่อตรวจสอบว่าเงื่อนไขเป็นจริงหรือไม่ในภายจะทำในลักษณะนี้คือ
ประกาศตัวแปรขึ้นมา 1 ตัว เพื่อเก็บสถานะนั้น
$done = false;
และในส่วนของโปรแกรม อาจจะมีการทำงานที่กำหนดให้ตัวแปรนี้มีค่าที่ให้ผลเป็นจริงเมื่อตรวจสอบ
$done = true;
และหลังจากนั้นเราก็จะตรวจสอบค่าของตัวแปรนี้ และทำอะไรบางอย่างหากเงื่อนไขเป็นจริง
if ($done) {
// do something
}
ซึ่งหากมีเงื่อนไขหรือสถานะหลายอย่าง ก็ต้องประกาศตัวแปรหลายตัว
$sent = false;
$saved = false;
$cancelled = false;
ในกรณีนี้เราสามารถใช้ isset() เพื่อทำให้ทุกอย่างง่ายขึ้น
เพราะ isset() ตรวจสอบการมีอยู่ของตัวแปร ดังนั้นจึงไม่จำเป็นต้องประกาศตัวแปรก่อนที่จะตรวจสอบ
เราจึงสามารถใช้ isset() ในการตรวจสอบสถานะอะไรบางอย่างได้โดยที่ไม่ต้องประกาศตัวแปรไว้ก่อน
if (isset($sent)) {
// do something
}
if (isset($saved)) {
// do something
}
if (isset($cancelled)) {
// do something
}
// ก่อนหน้านี้จะมีการสร้างตัวแปร $sent, $saved, $cancelled หรือไม่นั้น ไม่สำคัญ
// แต่หากมีการกำหนดให้ตัวแปรเหล่านี้มีค่าที่ไม่ใช่ null เงื่อนไขก็จะเป็นจริงทันที
// ทำให้ประหยัดหน่วยความจำที่จะต้องใช้ไปกับตัวแปรเหล่านี้
ความเร็วในการทำงานล่ะ เรียกใช้ฟังก์ชั่น isset()/empty() เยอะแยะมากมายในโปรแกรมแบบนี้จะไม่ทำให้ช้าหรือ?
คำตอบคือไม่เลยครับ
เพราะ isset()/empty() เป็นโครงสร้างภาษา (Language Construct) ไม่ใช่ฟังก์ชั่น (ถึงแม้จะมีรูปร่างหน้าตาเหมือนฟังก์ชั่น)
และแม้จะใช้การตรวจสอบตัวแปรแบบปกติ ก็ไม่ได้เร็วไปกว่า isset()/empty() เท่าไหร่เลย
$a = true;
$t = microtime(true);
for ($i = 0; $i < 1000000; ++$i) {
if (!$a) {
}
}
echo microtime(true) - $t . "<br />\n";
$t = microtime(true);
for ($i = 0; $i < 1000000; ++$i) {
if (empty($a)) {
}
}
echo microtime(true) - $t . "<br />\n";
นอกจากนี้เรายังสามารถใช้ isset() ในการตรวจสอบว่า array หรือสตริงมีขนาดน้อยกว่า หรือมากกว่าที่กำหนดหรือไม่ ซึ่งทำงานได้เร็วกว่าการใช้ฟังก์ชั่นเพื่อตรวจสอบ
// ปกติเราคงจะตรวจสอบความยาวสตริงด้วย strlen()
if (strlen($str) > 100) { // ตรวจสอบว่าความยาวมากกว่า 100 หรือไม่
echo "ยาวเกินไป";
}
// แต่เราก็สามารถใช้ isset() ตรวจสอบได้เหมือนกัน ซึ่งทำงานได้เร็วกว่า
if (isset($str[100])) { // ตรวจสอบว่ามีตัวอักษรที่ 101 ถูกกำหนดไว้แล้วหรือยัง (ตำแหน่งตัวอักษรเริ่มต้นที่ 0)
echo "ยาวเกินไป";
}
ศึกษาเพิ่มเติม
ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page