include dirname(__FILE__).'/../../index.php';
là đặt cược tốt nhất của bạn ở đây và nó sẽ tránh hầu hết các lỗi đường dẫn tương đối mà bạn có thể gặp phải với các giải pháp khác.
Thật vậy, nó sẽ buộc bao gồm phải luôn liên quan đến vị trí của tập lệnh hiện tại nơi mã này được đặt (vị trí nào có khả năng ổn định nhất, vì bạn xác định kiến trúc của ứng dụng của mình). Điều này khác với việc chỉ thực hiện include '../../index.php'
sẽ bao gồm tương đối vào tập lệnh đang thực thi (còn có tên là "gọi") và sau đó tương đối vào thư mục làm việc hiện tại , này sẽ trỏ đến tập lệnh mẹ bao gồm tập lệnh của bạn, thay vì phân giải từ đường dẫn của tập lệnh được bao gồm .
Từ tài liệu PHP:
Các tệp được đưa vào dựa trên đường dẫn tệp đã cho hoặc nếu không có đường dẫn nào được chỉ định thì include_path được chỉ định. Nếu tệp không được tìm thấy trong include_path, thì cuối cùng, include sẽ kiểm tra trong thư mục riêng của tập lệnh gọi và thư mục làm việc hiện tại trước khi bị lỗi.
Và bài đăng cũ nhất mà tôi đã tìm thấy trích dẫn thủ thuật này có từ năm 2003, bởi Tapken .
Bạn có thể kiểm tra với thiết lập sau:
Tạo một bố cục như thế này:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
Vào parent.php
, đặt:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
Vào sub/included.php
, đặt:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Kết quả khi truy cập parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Như chúng ta có thể thấy, trong trường hợp đầu tiên, đường dẫn được giải quyết từ tập lệnh gọi parent.php
, trong khi bằng cách sử dụng dirname(__FILE__).'/path'
thủ thuật, việc bao gồm được thực hiện từ tập lệnhincluded.php
nơi mã được đặt vào.
Hãy cẩn thận, điều sau KHÔNG tương đương với thủ thuật ở trên trái ngược với những gì có thể đọc ở nơi khác:
include '/../../index.php';
Thật vậy, việc chi tiêu trước /
sẽ hoạt động, nhưng nó sẽ giải quyết giống như include ../../index.php
từ tập lệnh gọi (sự khác biệt là include_path
sẽ không được xem xét sau đó nếu nó không thành công).Từ tài liệu PHP :
Nếu một đường dẫn được xác định - cho dù là tuyệt đối (bắt đầu bằng ký tự ổ đĩa hoặc \ trên Windows, hoặc / trên hệ thống Unix / Linux) hay liên quan đến thư mục hiện tại (bắt đầu bằng. Hoặc ..) - thì include_path sẽ bị bỏ qua hoàn toàn.