ต่างกันอย่างไร
$db_path = “../../db.json”
$db_path = DIR . “/../../db.json”;
ทั้งสองบรรทัดให้ผลลัพธ์ “คล้ายกัน” แต่ความน่าเชื่อถือและการทำงานต่างกันมากครับ
แบบที่ 1
$db_path = "../../db.json";เป็น Relative Path (พาธสัมพัทธ์)
หมายความว่า PHP จะหาตำแหน่งไฟล์โดยอิงจาก Current Working Directory (CWD) หรือโฟลเดอร์ที่สคริปต์กำลังรันอยู่ ไม่จำเป็นต้องเป็นโฟลเดอร์ที่ไฟล์นี้อยู่
ตัวอย่าง
project/
│
├── db.json
├── admin/
│ └── api/
│ └── save.phpสมมติ save.php มี
$db_path = "../../db.json";ถ้าเรียก
https://example.com/admin/api/save.phpอาจจะเจอ db.json
แต่ถ้าไฟล์นี้ถูก
include "admin/api/save.php";จากไฟล์อื่นที่อยู่คนละตำแหน่ง
index.phpCurrent Working Directory อาจเปลี่ยน ทำให้
../../db.jsonชี้ไปผิดที่ได้
แบบที่ 2
$db_path = __DIR__ . "/../../db.json";ใช้ Absolute Path ที่สร้างจากตำแหน่งของไฟล์ปัจจุบัน
__DIR__
คือ
โฟลเดอร์ที่ไฟล์ PHP ไฟล์นี้อยู่จริง
เช่น
/home/user/public_html/admin/apiดังนั้น
__DIR__ . "/../../db.json"จะกลายเป็น
/home/user/public_html/db.jsonไม่ว่าไฟล์นี้จะถูกเรียกจาก
- Browser
- include
- require
- cron
- command line (CLI)
ผลลัพธ์ก็จะเหมือนเดิมเสมอ
ตัวอย่าง
สมมติ
public_html/
│
├── db.json
├── index.php
└── api/
└── user/
└── save.phpภายใน
save.phpถ้าเขียน
echo "../../db.json";PHP อาจมองเป็น
public_html/../../db.jsonหรือ
api/user/../../db.jsonขึ้นกับว่า Current Working Directory คืออะไร
แต่ถ้าใช้
echo __DIR__ . "/../../db.json";จะได้
/home/username/public_html/db.jsonแน่นอนทุกครั้ง
ควรใช้อันไหน?
แทบทุกกรณีควรใช้
$db_path = __DIR__ . "/../../db.json";เพราะ
- ✅ ไม่ขึ้นกับตำแหน่งที่เรียกไฟล์
- ✅ ใช้กับ
includeและrequireได้ปลอดภัย - ✅ ลดปัญหา “หาไฟล์ไม่เจอ”
- ✅ เป็นแนวทางที่นิยมใช้ในโปรเจกต์ PHP
ผมเองแทบจะไม่ใช้ เดี่ยว ๆ แล้ว
"../../db.json"เว้นแต่เป็นกรณีง่าย ๆ ที่มั่นใจว่า Current Working Directory จะไม่เปลี่ยนครับ