Tương đối so với. đường dẫn tuyệt đối
Đầu tiên một lưu ý về đường dẫn tương đối so với. con đường tuyệt đối
Đường dẫn tương đối trỏ đến một tệp hoặc thư mục liên quan đến vị trí của tệp hiện tại
Nếu bạn có một bao gồm trong chỉ mục của bạn. php và đang sử dụng một đường dẫn tương đối để đưa vào như thế này
include ['foo.php'];
Sau đó, tập lệnh sẽ tìm tệp foo. php ở cùng một nơi với chỉ mục. php
Đường dẫn tuyệt đối là "đường dẫn đầy đủ" theo quan điểm của máy chủ web. Nó là đường dẫn chứa tài liệu gốc. Ví dụ
include ['/foo.php'];0
Nếu bạn có
include ['/foo.php'];1 nằm trong
include ['/foo.php'];2 [chú ý thư mục con] và đang sử dụng một đường dẫn tuyệt đối để đưa vào như thế này
include ['/foo.php'];
[Lưu ý dấu gạch chéo trước có nghĩa là đường dẫn tuyệt đối], khi đó tập lệnh sẽ tìm tệp
include ['/foo.php'];3 trong thư mục gốc của tài liệu của máy chủ web và không ở cùng vị trí với tệp
include ['/foo.php'];1. Do đó, tập lệnh mong muốn tìm thấy
include ['/foo.php'];3 trong thư mục
include ['/foo.php'];0 chứ không phải trong thư mục
include ['/foo.php'];2
Vấn đề
Nếu bạn giữ mọi thứ trong thư mục gốc của tài liệu và luôn biết ứng dụng của mình sẽ được cài đặt ở đâu, thì thật dễ dàng chỉ cần sử dụng một đường dẫn tuyệt đối để đưa vào mọi lúc và nếu bạn đang làm việc trên một hệ điều hành giống như Unix, biến số
include ['/foo.php'];8 sẽ
Nhưng nếu bạn đang phát triển một ứng dụng mã nguồn mở, và bạn không biết ứng dụng của mình sẽ được cài đặt ở đâu thì sao? . Khi ứng dụng đi vào bên trong thư mục con, bạn không còn có thể tin tưởng vào các đường dẫn tuyệt đối để đưa vào
Trong hầu hết các trường hợp, cách đặt cược an toàn nhất là sử dụng đường dẫn tương đối để đưa vào, nhưng cũng có một vấn đề tiềm ẩn với điều đó. Nếu ứng dụng của bạn cần bao gồm nhiều tệp khác nhau nằm trong nhiều thư mục con khác nhau và kết quả là "bao gồm lồng nhau", thì việc sử dụng đường dẫn tương đối sẽ không hiệu quả. Hãy tưởng tượng rằng bạn đang bao gồm một menu để tránh phải cập nhật từng tệp nếu phải thay đổi menu
Ví dụ
include ['/foo.php'];1
Bên trong
include ['/foo.php'];1 và mọi tệp khác, bạn bao gồm menu như thế này, sử dụng đường dẫn tương đối
include ['/foo.php'];3
Bên trong các tệp trong tài liệu, bạn bao gồm menu như thế này, sử dụng đường dẫn tương đối
include ['/foo.php'];4
Lúc đầu, điều này có vẻ hoàn hảo, nhưng còn các URL neo bên trong menu thì sao?
Hãy tưởng tượng rằng các URL của bạn trong
include ['/foo.php'];10 trông như thế này, lại là các đường dẫn tương đối
include ['/foo.php'];7
Nếu bạn đã tải tài liệu
include ['/foo.php'];1 và nhấp vào bất kỳ liên kết URL nào trong menu, nó sẽ hoạt động hoàn hảo, nhưng nếu tệp
include ['/foo.php'];13 được tải và bạn nhấp vào liên kết
include ['/foo.php'];1 để quay lại trang đầu, tập lệnh sẽ tìm kiếm
include ['/foo.php'];1
Một giải pháp có thể là chỉ sử dụng các đường dẫn tuyệt đối bên trong menu, như thế này
include ['/foo.php'];3
Nhưng một lần nữa, nếu ứng dụng được cài đặt bên trong thư mục con thì sao?
Điều tương tự cũng xảy ra khi sử dụng biến
include ['/foo.php'];17 làm tham chiếu
Ví dụ
include ['/foo.php'];5
include ['/foo.php'];18 hoạt động như một đường dẫn tuyệt đối và nó không bao gồm thư mục con
Tồn tại một số cách tiếp cận phổ biến để giải quyết các vấn đề được mô tả ở trên, nhưng việc giữ cho nó đơn giản đôi khi không phải là một lựa chọn [thật không may]
hệ thống đơn giản
Nếu bạn đang phát triển một ứng dụng cụ thể để chỉ hoạt động trên một máy chủ web cụ thể và ứng dụng đó không được cài đặt làm ứng dụng cho một số máy chủ web khác nhau, thì bạn nên giữ mọi thứ càng đơn giản càng tốt.
Nếu bạn đang tải một tệp nằm trong cùng thư mục với tệp nguồn, chỉ cần bao gồm tên tệp, không sử dụng bất kỳ đường dẫn nào. Đây là ví dụ rất cơ bản và đơn giản về đường dẫn tương đối vì tệp và thư mục đều ở cùng một nơi. Nói cách khác, không cần thông tin đường dẫn nếu các tệp nằm trong cùng một thư mục
Nếu bạn đang đưa menu vào từng tệp, nơi cần thiết và menu nằm bên trong thư mục con như thế này.
include ['/foo.php'];19, bạn cần nhớ tránh bao gồm menu từ các tệp nằm ở những nơi khác ngoài chính tài liệu gốc
Xác định đường dẫn cài đặt
Giải pháp phổ biến cho các sự cố được mô tả ở trên là xác định đường dẫn cài đặt và sau đó chỉ sử dụng các đường dẫn và URL tuyệt đối
Giải pháp này cực kỳ hiệu quả, nhưng thách thức nằm ở chỗ làm thế nào để định nghĩa một thứ mà bạn không biết
Đường dẫn cài đặt là nơi ứng dụng được cài đặt, nó là thư mục gốc của tài liệu được thêm vào bất kỳ thư mục con nào có thể
Cách Wordpres
Tôi không biết liệu Wordpress có còn sử dụng phương pháp này hay không, nhưng một cách thường được sử dụng để giải quyết vấn đề trên là quét tập lệnh cài đặt cho thư mục làm việc hiện tại khi cài đặt và sau đó lưu thông tin vào cơ sở dữ liệu [hoặc hệ thống tệp] cho
include ['/foo.php'];8
Tập lệnh cài đặt sẽ quét thư mục làm việc của nó và xóa tên tệp, sau đó lưu thông tin đó dưới dạng đường dẫn cài đặt trong cơ sở dữ liệu. Đường dẫn cài đặt sẽ được xác định là một hằng số và sau đó được sử dụng làm đường dẫn tuyệt đối xuyên suốt tất cả các tệp trong hệ thống
Đây là một ví dụ sẽ dẫn đến đường dẫn cài đặt
include ['/foo.php'];9
Đầu ra của lệnh phát nổ là một mảng. Tập lệnh sẽ thu thập phần tử cuối cùng của mảng, là tên tệp của tập lệnh đang chạy, bất kể nó nằm ở đâu. Kết quả còn lại là gốc tài liệu đã thêm bất kỳ thư mục con nào có thể
Phương pháp này khá hiệu quả, nhưng nó có một vấn đề nhỏ. Nếu người dùng cần di chuyển ứng dụng của mình sang một máy chủ khác và đường dẫn cài đặt thay đổi, anh ta không thể chỉ cần di chuyển ứng dụng và khôi phục cơ sở dữ liệu. Anh ấy phải thay đổi đường dẫn cài đặt bên trong cơ sở dữ liệu trước
Yêu cầu người dùng làm điều đó
Phương pháp này yêu cầu người dùng ghi thủ công đường dẫn cài đặt bên trong một biến trong tệp cấu hình
Vì người dùng phải nhập thông tin đăng nhập cơ sở dữ liệu của mình vào một số loại tệp cấu hình hoặc trong khi cài đặt, nên anh ta cũng có thể nhập đường dẫn cài đặt
Vấn đề chính với phương pháp này là rất nhiều người nhập sai đường dẫn cài đặt. Có hoặc không có dấu gạch chéo cần thiết, v.v. Và vì nó có thể được quét tự động nên thực sự không có lý do gì khiến người dùng phải nhập thủ công
thực hành tốt nhất
Mỗi giải pháp đều có ưu và nhược điểm riêng và tôi không nghĩ rằng có một cách thực hành tốt nhất cho vấn đề này. Các khung khác nhau sử dụng các giải pháp khác nhau cho các vấn đề
Điều tốt nhất cần làm là lập kế hoạch cho vấn đề để có được kết quả tốt nhất
Bao gồm PHP so với. yêu cầu
Sự khác biệt duy nhất giữa các hàm
include ['/foo.php'];30 và
include ['/foo.php'];31 hoặc
include ['/foo.php'];32 và
include ['/foo.php'];33 là khi xảy ra lỗi, các hàm bao gồm sẽ tạo ra một cảnh báo và tập lệnh sẽ tiếp tục thực thi trong khi các hàm yêu cầu tạo ra lỗi nghiêm trọng và tập lệnh sẽ dừng thực thi