ใน PHP จะมีฟังก์ชันที่ทำหน้าที่สำหรับนำเข้าไฟล์ (นำไฟลหนึ่งมาเป็นส่วนประกอบของอีกไฟล์หนึ่ง) อยู่หลายฟังก์ชันด้วยกัน แต่ที่มีคนนิยมใช้มากและพบเห็นได้บ่อย (ตามบทความหรือฟ source code ทั่วไป) จะมีอยู่ประมาณ 4 ฟังก์ชัน ซึ่งก็มีหลายคน งงว่าจะเลือกใช้อะไรดี เพราะใช้ ๆ ไปผลลัพธ์มันก็เหมือน ๆ กัน ในบทความนี้เราจะมาฟันธงกันครับว่าควรจะใช้อะไรดี
ซึ่ง 4 ฟังก์ชันที่ผมพูดถึง ได้แก่
1. include เช่น incude("connect.inc") หรือ include "connect.inc"
2. include_once เช่น include_once("connect.inc") หรือ include_once "connect.inc"
3. require เช่น require("connect.inc") หรือ require "connect.inc"
4. require_once เช่น require("conect.inc") หรือ require_once "connect.inc"
(***comment สำหรับมือใหม่นิดหนึ่งนะครับ ...ไม่จำกัดว่าต้องเป็นไฟล์นามสกุล *.inc นะครับ นามสกุลอะไรก็ได้ หรือจะเป็น url ก็ได้แต่นักเขียนโปรแกรมส่วนมากจะนิยมตั้งเป็น *.inc หรือ *.inc.php เพื่อให้สังเกตได้ง่ายว่าไฟล์นามสกุลแบบนี้จะต้อง ถูกเรียกใช้โดยไฟล์อื่น ประมาณนั้นครับ)
จะสังเกตเห็นว่ารูปแบบของการเรียกใช้งานไม่ได้ต่างกันเลย แต่ความจริงมันต่างกันครับ แล้วมันต่างกันยังไงละ
....ก่อนจะรู้ว่ามันต่างกันยังไงเรามาดูที่ศัพท์ภาษาอังกฤษกันก่อนนะครับ ในชื่อฟังก์ชันทั้ง 4 ฟังก์ชันนั้นจะมีศัพท์ภาษาอังกฤษหลัก ๆ อยู่ 3 คำคือ "include", "require" และ "once" ลองเปิดโปรแกรม dictionary ที่มีอยู่ ในเครื่องคุณดูสิครับว่าแต่ละคำหมายความว่าอะไร ความหมายที่ได้จะประมาณนี้ครับ
include = รวมถึง, ประกอบด้วย
require = ต้องการ
once = ครั้งเดียว, หนเดียว
ดูจากคำแปลก็น่าจะรู้แล้วนะครับว่าฟังก์ชันไหนให้ความสำคัญกับไฟล์ที่นำเข้ามามากกว่ากัน ....ใช่ครับ require ฟังก์ชัน require() กับ require_once() จะให้ความสำคัญกับไฟล์ที่นำเข้ามามากกว่า สรุปก็คือ
ฟังก์ชัน include() กับ include_once() เมื่อใช้แล้ว ถ้ามันไม่เจอไฟล์ตามที่ระบุ มันจะรายงาน error แค่ Warning เท่านั้นแล้วก็ข้ามไปส่วนอื่นต่อได้ จึงนิยมใช้เรียกไฟล์พวกข้อความ หรือ html ธรรมดา เพราะไม่ค่อยจำเป็นเท่าไหร่โปรแกรมยังสามารถข้ามไปทำงานส่วนอื่นต่อได้อีก ยังไม่สมควารต้องหยุด
ต่างกันกับ require() กับ require_once() ซึ่งถ้าไม่เจอไฟล์ตามที่ระบุแล้ว มันจะรายงาน error มาเป็น Final error ทันทีแล้วก็จะโปรแกรมก็จะหยุดแค่ตรงนั้น จีงนิยมใช้เรียกไฟล์ที่เก็บฟังก์ชัน, คลาส หรือค่า config ต่าง ๆ ที่มีความจำเป็นมาก เพราะถ้าข้าม
การเรียกไฟล์ส่วนนี้ไปผลลัพธ์ส่วนอื่นที่ถึงแม้รันออกมาได้ก็ไร้ค่า
...มาลองทดสอบกันดูนะครับ คุณลองสร้างไฟล์ php ขึ้นมา 2 ไฟล์ ไฟล์แรกเขียนสคริปต์นี้ลงไปครับ
<?
include("abcdefghijk.php"); //หมายถึงชื่อไฟล์ที่ไม่มีอยู่จริงหนะครับ ^^
?>
ไฟล์ที่สองเขียนสคริปต์นี้ลงไปครับ
<?
require("hijklmnop.php"); //เป็นชื่อไฟล์ที่ไม่มีอยู่จริงเช่นกันครับ
?>
ลองสังดูความแตกต่างเอาเองนะครับ
....อย่าเพิ่งปิดบทความนี้นะครับ ยังไม่จบครับ ^^ ผมยังไม่ได้บอกคุณเลยว่า มี once กับ ไม่มี once มันแตกต่างกันยังไง มี once กับ ไม่มี once จะรายงาน error เหมือนกันครับตามที่บอกไว้แล้วข้างต้น แต่มันต่างกันตรงที่การเรียกใช้ครับ ขอยก
ตัวอย่าง
เป็น require ก็แล้วกันนะครับ เช่นในเว็ปเพจหน้าหนึ่งผมใช้ require("test.php") 5 ครั้ง ไฟล์ test.php ก็จะถูกนำเข้ามาโดยความสำคัญแบบ require ถึง 5 ครั้งเลยครับ แต่ถ้าผมเรียก require_once("test.php") 5 ครั้ง ไฟล์ test.php จะถูกนำเข้ามาโดยความสำคัญแบบ require แค่ครั้งเดียวครับ(ชื่อมันก็บอกอยู่แล้ว - -" ตามความหมายที่อธิบายไว้ข้างต้น)
เรามาทดสอบตัวอย่างจริงกันเลยดีกว่าครับ ผมขอยกตัวอย่างแค่ require นะครับเพราะสำคัญมากกว่า ส่วน include นั้นไปลองดูเองนะครับ
ขั้นแรก ให้คุณสร้างไฟล์ test.php โดยเขียนสคริปต์ดังนี้
<?
#test.php
echo "ถูกนำเข้าครั้งที่ $i <br>";
?>
ขั้นที่สอง สร้างไฟล์ php ขึ้นมาอีก 2 ไฟล์ โดยไฟล์แรกเขียนสคริปต์ดังนี้
<?
#require.php
for($i=1;$i<=5;$i++)
require("test.php"); //นำเข้าไฟล์ test.php ที่สร้างไว้
?>
ไฟล์ที่สองเขียนสคริปต์ดังนี้
<?
#require_once.php
for($i=1;$i<=5;$i++)
require_once("test.php"); //นำเข้าไฟล์ test.php ที่สร้างไว้
?>
ลองรันแล้วสังเกตความแตกต่างระหว่างผลลัพธ์จากทั้งสองไฟล์ดูนะครับ หวังว่าคงเข้าใจ