Một cách đơn giản để có đường dẫn tuyệt đối của kịch bản ban đầu được thực hiện , trong đó kịch bản và bất kỳ kịch bản khác bao gồm include
, require
, require_once
là bằng cách sử dụng một hằng số và lưu trữ có con đường kịch bản hiện tại bắt đầu của kịch bản chính :
define( 'SCRIPT_ROOT', __FILE__ );
Giải pháp trên phù hợp khi có một tập lệnh "chính" duy nhất include
là mọi tập lệnh cần thiết khác, như trong hầu hết các ứng dụng web.
Nếu đó không phải là trường hợp và có thể có một số "tập lệnh intital" thì để tránh xác định lại và để có đường dẫn chính xác được lưu trữ bên trong hằng số, mỗi tập lệnh có thể bắt đầu bằng:
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}
Một lưu ý về câu trả lời (hiện tại) được chấp nhận :
câu trả lời nói rằng đường dẫn kịch bản được thực hiện ban đầu là phần tử đầu tiên của mảng được trả về bởi get_included_files()
.
Đây là một giải pháp thông minh và đơn giản và - trong thời gian viết - (chúng tôi gần như ở PHP 7.4.0) nó hoạt động .
Tuy nhiên, bằng cách xem tài liệu , không có đề cập rằng tập lệnh được thực hiện ban đầu là mục đầu tiên của mảng được trả về bởiget_included_files()
.
Chúng tôi chỉ đọc
Tập lệnh được gọi ban đầu được coi là "tệp được bao gồm", do đó, tập lệnh sẽ được liệt kê cùng với các tệp được tham chiếu bởi bao gồm và họ.
Tại thời điểm viết " kịch bản ban đầu được gọi " là tập lệnh đầu tiên trong mảng nhưng - về mặt kỹ thuật - không có gì đảm bảo rằng điều này sẽ không thay đổi trong tương lai.
Một lưu ý về realpath()
, __FILE__
và __DIR__
:
Những người khác đã gợi ý trong câu trả lời của họ sử dụng __FILE__
, __DIR__
, dirname(__FILE__)
, realpath(__DIR__)
...
dirname(__FILE__)
bằng __DIR__
(được giới thiệu trong PHP 5.3.0), vì vậy chỉ cần sử dụng__DIR__
.
Cả hai __FILE__
và __DIR__
luôn luôn là con đường tuyệt đối vì vậy realpath()
là không cần thiết.