คำอธิบายปัญหา
ก่อนอื่นมาดูโครงสร้างไดเรกทอรีของตัวอย่างของเราและเนื้อหาของไฟล์ทั้งสามนี้
A.php
<? phpinclude './c/d.php'
b.php
<? phpdefine ('__ b', 'นี่คือการทดสอบ');C/D.PHP
<? phpinclude '../b.php';var_dump(__b);
ไฟล์ D.PHP ภายใต้ไดเรกทอรี C หมายถึงไฟล์ B.PHP ภายใต้ไดเรกทอรีด้านบน มันจะไม่มีปัญหาใด ๆ เมื่อเรียกใช้ C/D.PHP แยกกัน
อย่างไรก็ตามหาก A.PHP อ้างอิง C/D.PHP ในไดเรกทอรีเดียวกับ B จะมีปัญหา
รายงานข้อผิดพลาดโดยบอกว่าไม่มีไฟล์
คิด
ความหมายทั่วไปคือหลังจาก A.PHP แนะนำ C/D.PHP ลงใน A.PHP เส้นทาง include '../b.php' สัมพันธ์กับ A.PHP และเส้นทางสัมพัทธ์สำหรับ A.PHP ไม่มีอยู่ดังนั้นปัญหานี้เกิดขึ้น
หากไฟล์อาจถูกอ้างอิงในหลายสถานที่มันค่อนข้างง่ายที่จะมีปัญหาและจากนั้นเราสามารถแก้ปัญหานี้ได้อย่างง่ายดายโดยใช้เส้นทางสัมบูรณ์
ใช้เส้นทางสัมบูรณ์เพื่อแก้ปัญหา
หากเราเปลี่ยนไฟล์เป็นต่อไปนี้
A.php
<? phpinclude __dir __. '/../b.php'; var_dump (__ b);
b.php
<? phpdefine ('__ b', 'นี่คือการทดสอบ');C/D.PHP
<? phpinclude __dir __. '/../b.php'; var_dump (__ b);
สิ่งนี้เปลี่ยนเป็นหมายถึงเส้นทางที่แน่นอนของไฟล์ __DIR__ เป็นค่าคงที่เวทมนตร์ที่กำหนดไว้ล่วงหน้าซึ่งมีอยู่ใน PHP5.3 ซึ่งบ่งบอกถึงไดเรกทอรีที่ไฟล์อยู่ จากนั้นเราใช้สิ่งนี้เพื่อเขียนเส้นทางสัมบูรณ์ซึ่งสามารถดำเนินการได้ตามปกติเมื่อเรียกใช้ A.PHP และ C/D.PHP หากใช้ dirname(__FILE__) แทน __DIR___ ก่อน php5.3
สรุป
ข้างต้นคือทั้งหมดเกี่ยวกับปัญหาของเส้นทางสัมพัทธ์ใน PHP และการใช้เส้นทางสัมบูรณ์ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนที่ใช้ PHP และหลีกเลี่ยงการเข้าสู่หลุมของเส้นทางสัมพัทธ์ใน PHP อีกครั้ง