PHP : ปัญหาโลกแตก include_once กับ require_once ต่างกันไฉน

PHP : ปัญหาโลกแตก include_once กับ require_once ต่างกันไฉน

ก่อนอื่นต้องแยกระหว่าง require กับ include อย่าเพิ่งไปสนใจ once 
ที่แน่ๆมันคือการเรียกไฟล์ เข้ามาทำงาน แต่ความแตกต่างระหว่าง include กับ require คือ priority หรือความสำคัญของไฟล์ที่เราเรียกเข้ามาทำงาน 

require คือถ้าไฟล์ไม่มีโปรแกรมหยุดทำงานทันที
include คือถ้าไฟล์ไม่มีช่างหัวมันสคริปท์ทำงานต่อ

เพราะฉะนั้นเราสมควรใช้ require กับการเรียกไฟล์จำพวก function หรือ library ต่างๆ ที่หากไม่มีแล้วสคิรปท์ไม่สามารถทำงานได้อย่างถูกต้อง 



ต่อไปมาดูที่ once ซึ่งจะเหมือนกันทั้ง include_once และ require_once
นั่นคือไฟล์ที่เราเรียกมาใช้งานนี้ต้องไม่ถูกเรียกมาก่อนหน้านี้

ทำไมถึงต้อง once ?

บางไฟล์ที่เป็นไฟล์สำคัญๆ เช่น config.php ซึ่งประกาศตัวแปรที่จำเป้ฯต้องใช้ในระบบทั้งหมด หากในสคริปท์ส่วนที่หลังจากเรียกไฟล์ config.php เข้ามาำทำงานแล้ว มีการดำเนินการใดๆกับตัวแปรที่ถูกประกาศไว้ที่ไฟล์ config.php ซึ่งค่ามันเปลี่ยนแปลงไปแล้ว หลังจากตรงนี้ถ้าเราเรียกไฟล์ config.php กลับเข้ามาอีกจะทำให้ค่าของตัวแปรที่เปลี่ยนไปหลังจากเรียกทีแรก กลับมาเป็นค่าเดิมใน config.php ทำให้เกิดบั๊กขึ้นกับโปรแกรมได้

อีกกรณีพวก function หรือ class ต่างๆ จะสามารถประกาศได้เพียงหนึ่งครั้งเท่านั้น การประกาศ function หรือ class ซำ้ซ้อนถือเป็น fatal error โปรแกรมจะไม่ทำงานต่อไป เพราะฉะนั้นไฟล์ที่ประกาศ function หรือ class จะต้องใช้ _once ในการเรียก

การทำงานของ _once คือ เมื่อเจอ require_once หรือ include_once PHP จะเช็คก่อนว่าไฟล์นี้ถุกเรียกเข้ามาก่้อนหน้านี้รึยัง (ไม่ว่าจะเรียกเข้ามาด้วย require , include , require_once หรือ include_once) ถ้ามีแล้ว PHP จะไม่สนใจการเรียกครั้งนี้

โค๊ด:

<?php
require 'a.php'; // เรียกครั้งแรก
require_once 'a.php'; // เรียกครั้งนี้ PHP จะไม่สน เพราะถูกเรีัยกมาแล้ว
require 'a.php'; // เรียกครั้งนี้ PHP จะเรียกไฟล์นี้ขึ้นมา เพราะ PHP จะเช็คก็ต่อเมื่อการเรียกถูกกำกับด้วย _once เท่านั้น
?>

ผมเลยใช้ require_once จนติดเป็นนิสัยไปแล้ว ส่วนการ include ผมจะใช้เฉพาะกับพวก template เท่านั้น เพราะถ้าบางส่วนของ template หายไปก็ให้แสดงหน้าเว็บเท่าที่มีออกไปประมาณนี้แหละครับ



credit : ball6847 from http://www.thaiseoboard.com/index.php?topic=70259.0%3Bwap2

แสดงความคิดเห็น

0 ความคิดเห็น