ในการเขียนโปรแกรมด้วย PHP ยุคใหม่ (ตั้งแต่ PHP 8.1 เป็นต้นไป) มีฟีเจอร์หนึ่งที่ช่วยให้โค้ดของเรามีความชัดเจน แม่นยำ และปลอดภัยมากขึ้น นั่นคือการกำหนด Type Hinting แบบ never type บทความนี้จะพาไปทำความเข้าใจว่า never type คืออะไร แตกต่างจาก void อย่างไร และจะนำไปประยุกต์ใช้กับฟังก์ชันที่ไม่มีวัน Return (เช่นการทำ Redirect หรือสั่ง Exit) ได้อย่างไรครับ
never type คืออะไร?
never คือ Return Type ที่ใช้ระบุว่า “ฟังก์ชันนี้จะไม่มีวันส่งค่ากลับมาและสิ้นสุดการทำงานแบบปกติได้เลย” เมื่อเรากำหนดให้ฟังก์ชันส่งค่ากลับเป็น never ฟังก์ชันนั้นจะต้องเกิดเหตุการณ์อย่างใดอย่างหนึ่งใน 2 กรณีนี้เท่านั้น
- มีการเรียกใช้คำสั่ง
exit()หรือdie()เพื่อหยุดการทำงานของสคริปต์ทันที - มีการโยน Exception (
throwException) ออกไป
ข้อสังเกต
ถ้าเราประกาศฟังก์ชันเป็น never แต่ภายในดันทะลึ่งมีคำสั่ง return หรือปล่อยให้ฟังก์ชันทำงานจนจบ Block {} ตามปกติ PHP จะพ่นข้อผิดพลาด TypeError ออกมาทันที
ความแตกต่างระหว่าง void กับ never
หลายคนมักจะสับสนระหว่างสองตัวนี้ เพราะดูเหมือนเป็นการ “ไม่คืนค่า” เหมือนกัน แต่ในทางทฤษฎีและปฏิบัติ มันต่างกันโดยสิ้นเชิงครับ
| คุณสมบัติ | void | never |
| ความหมาย | ทำงานเสร็จแล้ว ไม่ส่งค่าอะไรกลับมา | ฟังก์ชันนี้ ไม่มีวันทำงานเสร็จสิ้นแบบปกติ |
| การควบคุม | โปรแกรมจะทำงานในบรรทัดถัดไปต่อ | โปรแกรมที่เรียกใช้จะหยุดลง หรือกระโดดไปที่ Catch Block |
| ตัวอย่างการใช้ | ฟังก์ชันเซ็ตค่า (Setter), ฟังก์ชันบันทึก Log | ฟังก์ชัน Redirect, ฟังก์ชันหยุดการทำงาน |
การประยุกต์ใช้งานในชีวิตจริง
ลองมาดูตัวอย่างยอดฮิตที่เรามักจะได้ใช้ never กันบ่อย ๆ ครับ
ฟังก์ชันสำหรับการ Redirect (HTTP Redirection)
ในระบบ Web Application หลังจากที่เราสั่ง header('Location: ...') แล้ว เรามักจะต้องสั่ง exit() ควบคู่ไปด้วยเสมอเพื่อป้องกันไม่ให้ Script ด้านล่างทำงานต่อ
PHP
<?php
// ประกาศฟังก์ชันด้วยระบบเนเวอร์รรร!
function redirectToLogin(): never
{
header('Location: /login.php');
exit(); // สิ้นสุดการทำงานตรงนี้ ไม่มีทางรันไปถึงบรรทัดอื่น
}
// การใช้งาน
if (!isLoggedIn()) {
redirectToLogin();
// Static Analysis Tool (เช่น PHPStan) จะรู้ทันทีว่าโค้ดตรงนี้ไม่มีวันถูกรัน
echo "โค้ดตรงนี้จะไม่มีวันถูกประมวลผล";
}