ต่างกันอย่างไร
$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.php
Current 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 จะไม่เปลี่ยนครับ