🟣 PHP

จัดระเบียบโค้ด PHP ให้เป็นมืออาชีพด้วย include และ require

9 นาที 13 views บันทึกเป็น PDF
จัดระเบียบโค้ด PHP ให้เป็นมืออาชีพด้วย include และ require

เรียนรู้วิธีแยกไฟล์โค้ด PHP ด้วย include, require, include_once และ require_once เพื่อเปลี่ยนโค้ดสปาเก็ตตี้ให้เป็น Modular Code ที่จัดการง่าย

ทำความรู้จักกับ Modular Code และทำไมมือใหม่ต้องแยกไฟล์

เวลาเราเริ่มเขียนโปรแกรมด้วยภาษา PHP ในช่วงแรก เรามักจะเขียนโค้ดทุกอย่างรวมไว้ในไฟล์เดียว ตั้งแต่การเชื่อมต่อฐานข้อมูล การแสดงผลหน้าเว็บ ไปจนถึงการประมวลผลข้อมูล ซึ่งวิธีนี้อาจจะดูสะดวกในโปรเจกต์ขนาดเล็ก แต่เมื่อโปรเจกต์เริ่มใหญ่ขึ้น โค้ดของคุณจะกลายเป็น "สปาเก็ตตี้" ที่แก้ไขยากมาก การแยกโครงสร้างโค้ดด้วย include และ require จึงเป็นก้าวแรกที่สำคัญมากในการก้าวไปสู่การเป็นโปรแกรมเมอร์มืออาชีพ

ลองจินตนาการว่าคุณกำลังสร้างบ้าน ถ้าคุณต้องสร้างบ้านทั้งหลังด้วยการหล่อปูนก้อนเดียวตั้งแต่ฐานรากจนถึงหลังคา มันจะเป็นงานที่เหนื่อยและแก้ไขอะไรไม่ได้เลย แต่ถ้าคุณแยกส่วนประกอบออกเป็น ชิ้นส่วนสำเร็จรูป เช่น ผนังสำเร็จรูป หลังคา หรือประตู คุณสามารถหยิบส่วนประกอบเหล่านี้มาประกอบกันได้ง่ายขึ้น Modular Code (การเขียนโค้ดแยกเป็นส่วนๆ) ก็เช่นกัน มันช่วยให้เราจัดการโค้ดได้เป็นระเบียบและนำกลับมาใช้ใหม่ได้โดยไม่ต้องเขียนซ้ำ

การเข้าใจเรื่องนี้จะช่วยให้คุณทำงานร่วมกับทีมได้ง่ายขึ้น เพราะในโลกการทำงานจริง ไม่มีใครเขียนโค้ดไฟล์เดียวหมื่นบรรทัดแน่นอน การแยกไฟล์ช่วยให้คุณสามารถแบ่งงานกับเพื่อนร่วมทีมได้ หรือแม้แต่การจัดการกับส่วนประกอบที่ใช้บ่อย เช่น ส่วนหัวของเว็บ (Header) หรือส่วนท้าย (Footer) ก็สามารถทำได้เพียงแค่เรียกใช้ไฟล์เดียวผ่านคำสั่งของ PHP เท่านั้นครับ

ความแตกต่างระหว่าง include และ require

คำสั่ง include และ require มีหน้าที่เหมือนกันคือการ "ดึง" เนื้อหาจากไฟล์ภายนอกเข้ามาใช้งานในไฟล์ปัจจุบัน แต่จุดที่ต่างกันคือ "วิธีจัดการเมื่อไฟล์นั้นหาไม่เจอ" ซึ่งเป็นเรื่องที่โปรแกรมเมอร์จูเนียร์ต้องระวังให้ดี เพราะมันส่งผลต่อความปลอดภัยและเสถียรภาพของระบบโดยตรง

เมื่อคุณใช้ include หาก PHP หาไฟล์นั้นไม่พบ มันจะแจ้งเตือนเป็น Warning (คำเตือน) แต่โปรแกรมจะยังคงทำงานต่อไปในส่วนที่เหลือ ซึ่งในบางกรณีอาจทำให้เกิดบั๊กที่คาดไม่ถึงได้ แต่สำหรับ require หากหาไฟล์ไม่พบ PHP จะหยุดการทำงานของโปรแกรมทันทีด้วย Fatal Error (ข้อผิดพลาดร้ายแรง) ซึ่งมักเป็นสิ่งที่เราต้องการเมื่อไฟล์ที่ขาดไปเป็นไฟล์สำคัญ เช่น ไฟล์ตั้งค่าระบบ

สรุปง่ายๆ คือ ใช้ include กับส่วนที่ไม่สำคัญมาก เช่น ไฟล์แสดงโฆษณาหรือส่วนเสริมที่ไม่กระทบโครงสร้างหลัก แต่ให้ใช้ require กับไฟล์สำคัญ เช่น ไฟล์ตั้งค่าฐานข้อมูล (Database Config) หรือไฟล์ฟังก์ชันหลักของระบบ เพื่อให้แน่ใจว่าถ้าไฟล์เหล่านี้พัง ระบบของเราจะหยุดทำงานทันที แทนที่จะแสดงผลที่ผิดพลาดให้ผู้ใช้งานเห็น

// ตัวอย่างการใช้งานเบื้องต้น
// ไฟล์ config.php เก็บข้อมูลตั้งค่า
$db_name = "my_database";

// ไฟล์ index.php
require 'config.php'; // ถ้าไฟล์นี้ไม่มี โปรแกรมจะหยุดทำงานทันที
include 'header.php'; // ถ้าไฟล์นี้ไม่มี แค่แจ้งเตือน แต่เว็บยังรันต่อได้

echo "เชื่อมต่อฐานข้อมูลสำเร็จ: " . $db_name;

ทำความรู้จักกับ include_once และ require_once

ในสถานการณ์จริง บางครั้งเราอาจเผลอเรียกไฟล์เดิมซ้ำหลายครั้งโดยไม่ตั้งใจ ซึ่งอาจนำไปสู่ปัญหาการประกาศตัวแปรซ้ำ หรือการนิยามฟังก์ชันซ้ำจนโปรแกรมพังได้ include_once และ require_once จึงถูกออกแบบมาเพื่อแก้ปัญหานี้โดยเฉพาะ โดยมันจะตรวจสอบก่อนว่าไฟล์นั้นถูกเรียกเข้ามาในระบบแล้วหรือยัง

ถ้าคุณใช้ include_once หรือ require_once แล้ว PHP ตรวจพบว่าไฟล์นั้นเคยถูกโหลดเข้ามาแล้ว มันจะเพิกเฉยต่อคำสั่งเรียกซ้ำนั้นทันที สิ่งนี้เปรียบเสมือนการเช็คชื่อก่อนเข้าห้องประชุม ถ้าคนนั้นเข้ามาแล้วก็ไม่จำเป็นต้องให้ลงชื่อซ้ำอีก ช่วยป้องกันความวุ่นวายในระบบได้เป็นอย่างดี

มือใหม่มักจะถามว่า "แล้วทำไมไม่ใช้แบบ _once ตลอดเวลาล่ะ?" คำตอบคือมันมีต้นทุนในการประมวลผลที่สูงกว่านิดหน่อยเพราะระบบต้องคอยเช็คฐานข้อมูลไฟล์ที่โหลดไปแล้ว แต่ในโปรเจกต์ขนาดเล็กถึงกลาง การใช้ require_once แทบจะเป็นมาตรฐานความปลอดภัยที่แนะนำ เพราะช่วยป้องกันบั๊กจากการเรียกไฟล์ซ้ำได้ดีที่สุด

// การใช้แบบ _once เพื่อป้องกันการซ้ำ
require_once 'functions.php';
require_once 'functions.php'; // บรรทัดนี้จะถูกข้ามไป เพราะไฟล์ถูกโหลดแล้ว

// ถ้าเป็น require ปกติ บรรทัดที่สองจะทำให้เกิด Error ทันที

โครงสร้างไฟล์ที่โปรแกรมเมอร์มืออาชีพนิยมใช้

การจัดระเบียบไฟล์เป็นทักษะที่แยก "มือสมัครเล่น" ออกจาก "มือโปร" ได้ชัดเจนที่สุด เมื่อคุณเริ่มใช้ include คุณควรเริ่มสร้างโฟลเดอร์สำหรับแยกประเภทไฟล์ เช่น โฟลเดอร์ includes/ สำหรับเก็บไฟล์ย่อย และโฟลเดอร์ config/ สำหรับเก็บไฟล์ตั้งค่า เพื่อให้โครงสร้างโปรเจกต์ของคุณดูสะอาดตา

สมมติว่าคุณมีโปรเจกต์เว็บไซต์หนึ่งตัว โครงสร้างที่ดีควรเป็น: ไฟล์ index.php อยู่ที่รูท (Root) โฟลเดอร์หลัก, ไฟล์ที่ใช้ซ้ำบ่อยๆ เช่น header.php และ footer.php ควรอยู่ในโฟลเดอร์ templates/ และไฟล์ที่เก็บค่าคงที่ต่างๆ ควรอยู่ใน config/ วิธีนี้จะช่วยให้เวลาคุณต้องแก้ไขส่วนหัวของเว็บ คุณรู้ทันทีว่าต้องไปแก้ที่ไหน

การใช้ Relative Path (เส้นทางไฟล์แบบสัมพันธ์) เช่น include 'templates/header.php'; เป็นเรื่องพื้นฐาน แต่ต้องระวังเรื่องตำแหน่งของไฟล์ที่เรียกใช้เสมอ หากคุณย้ายไฟล์ไปไว้ในโฟลเดอร์ลึกๆ เส้นทางนี้อาจจะพังได้ การหมั่นตรวจสอบโครงสร้างโฟลเดอร์อยู่เสมอจะช่วยให้คุณพัฒนาทักษะการจัดการโปรเจกต์ได้ดีขึ้น

// โครงสร้างที่แนะนำ
// /project
//   /config
//     db.php
//   /templates
//     header.php
//   index.php

// ใน index.php
require_once 'config/db.php';
include 'templates/header.php';

ข้อควรระวังและจุดที่มือใหม่มักพลาด

จุดที่มือใหม่พลาดบ่อยที่สุดคือเรื่อง Path (เส้นทางไฟล์) ที่ไม่ถูกต้อง โดยเฉพาะเมื่อมีการย้ายไฟล์ไปมาในโฟลเดอร์ที่ต่างระดับกัน จำไว้ว่า include จะอ้างอิงตำแหน่งตามไฟล์ที่กำลังรันอยู่ ไม่ใช่ตามตำแหน่งของไฟล์ที่ถูกเรียกเข้ามา ซึ่งมักจะทำให้เกิดปัญหา "File not found" ได้บ่อยครั้ง

อีกเรื่องที่สำคัญคือความปลอดภัย อย่าใช้ include กับตัวแปรที่รับค่ามาจากผู้ใช้งานโดยตรง เช่น include($_GET['page']); เพราะนี่คือช่องโหว่ร้ายแรงที่เรียกว่า Local File Inclusion (LFI) ซึ่งเปิดโอกาสให้แฮกเกอร์สามารถสั่งรันไฟล์อันตรายในเซิร์ฟเวอร์ของคุณได้ ให้ใช้วิธีการกำหนดชื่อไฟล์ที่ยอมรับได้ในรูปแบบ White List (รายการที่อนุญาต) เท่านั้น

คำแนะนำคือให้ใช้ __DIR__ ซึ่งเป็นค่าคงที่ใน PHP ที่บอกตำแหน่งของไฟล์ปัจจุบันเสมอ เพื่อสร้างเส้นทางแบบเต็ม (Absolute Path) เช่น include __DIR__ . '/templates/header.php'; วิธีนี้จะช่วยให้โค้ดของคุณทำงานได้อย่างแม่นยำไม่ว่าจะเรียกจากไฟล์ไหนก็ตาม เป็นนิสัยการเขียนโค้ดที่ดีที่โปรแกรมเมอร์รุ่นพี่ทุกคนแนะนำ

สรุป: การนำไปใช้จริงในโปรเจกต์แรกของคุณ

การใช้ include และ require ไม่ใช่แค่เรื่องของความสะดวก แต่เป็นเรื่องของ Maintainability (ความสามารถในการบำรุงรักษา) โปรเจกต์ที่เขียนโค้ดแยกส่วนกันอย่างชัดเจนจะช่วยให้คุณอัปเดตฟีเจอร์ได้เร็วขึ้นมาก ลองนึกภาพว่าคุณมีเมนูเว็บเหมือนกัน 10 หน้า ถ้าคุณไม่ได้แยกไฟล์ไว้ คุณต้องแก้โค้ดเมนูถึง 10 ครั้ง แต่ถ้าคุณใช้ include 'menu.php'; คุณแก้แค่จุดเดียว ทุกหน้าจะอัปเดตตามทันที

จงเริ่มฝึกตั้งแต่วันนี้ ด้วยการแยกไฟล์ header.php และ footer.php ออกจากไฟล์หลักของคุณในโปรเจกต์เว็บไซต์แรก แล้วลองใช้ require_once สำหรับไฟล์ตั้งค่าฐานข้อมูลดูครับ นี่คือขั้นตอนแรกสู่การเขียนโค้ดแบบมืออาชีพที่คุณจะขอบคุณตัวเองในอนาคตที่ทำแบบนี้ตั้งแต่ต้น

สุดท้ายนี้ โปรแกรมเมอร์ที่เก่งไม่ได้วัดกันที่จำนวนโค้ดที่เขียนได้ แต่เป็นความสามารถในการจัดระเบียบโค้ดให้คนอื่น (หรือตัวคุณเองในอีก 6 เดือนข้างหน้า) สามารถอ่านและเข้าใจได้ง่าย การแยกโครงสร้างไฟล์คือการลงทุนที่คุ้มค่าที่สุดอย่างหนึ่งในการพัฒนาซอฟต์แวร์ ขอให้สนุกกับการจัดระเบียบโค้ดและก้าวสู่การเป็นนักพัฒนาที่มีคุณภาพครับ

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย
PHP

สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย

เรียนรู้วิธีสร้างระบบ Authentication ด้วย PHP 8 ตั้งแต่การสมัครสมาชิก การ Hash รหัสผ่านด้วย password_hash ไปจนถึงการทำระบบ Login และ Protected Dashboard

1 month ago 7 นาที
21 views
สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters
PHP

สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters

เรียนรู้วิธีแก้ไขและลบข้อมูลในฐานข้อมูลด้วย PHP 8 และ PDO พร้อมเทคนิคการใช้ Bind Parameters เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 6 นาที
20 views
สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection
PHP

สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection

เรียนรู้วิธีจัดการฐานข้อมูลด้วย PHP 8 ผ่าน PDO อย่างมืออาชีพ พร้อมเทคนิคการใช้ Prepared Statements เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 7 นาที
21 views