2012-05-03 39 views
13

Tôi đã trên internet cố gắng tìm ra cách tốt nhất để xử lý đường dẫn trong trang web của mình. Tôi có nên sử dụng đường dẫn tương đối, đường dẫn tuyệt đối không?Thực tiễn tốt nhất cho các đường dẫn PHP

Tôi đã thấy tên đệm (FILE) được đề cập nhiều lần. Một vấn đề tôi có với đường dẫn tương đối là các tệp php được bao gồm bởi một số tệp khác ở các cấp thư mục khác nhau khiến các đường dẫn tương đối bị phá vỡ. Ví dụ: nếu cấu trúc thư mục là

Root 
    A 
    B 
     b 

Và tệp php trong b và A bao gồm một tệp khác từ B thì đường dẫn tương đối cho mã trong tệp trong B sẽ khác nhau.

Xin lỗi nếu điều đó gây nhầm lẫn Tôi đang gặp khó khăn khi nhập nội dung tôi đang cố gắng nói.

Vì vậy, nói chung cách tốt nhất để xử lý đường dẫn đến tệp liên quan đến bao gồm và hoạt động tệp trong mã là gì.

Cảm ơn bạn

+0

Đó là vấn đề với bất kỳ điều gì "Tốt nhất", nó hầu như luôn chủ quan. –

Trả lời

0

Bạn có thể đặt tất cả các tệp bao gồm vào một thư mục chính. Sau đó tạo một biến đường dẫn trong một tệp cấu hình hoặc trong chính kịch bản lệnh, trỏ đến thư mục bao gồm.

+0

Điều này sẽ hiệu quả, nhưng nó phá vỡ tổ chức của tôi. Tôi đang cố giữ các tệp của mình trong một cấu trúc thư mục hợp lý bởi vì có quá nhiều. – Nath5

-1

Phiên bản mới của php (PHP5.3) có thể sử dụng __autoload Vì vậy, bạn chỉ cần xác định gốc của ứng dụng của bạn.

+0

Tự động tải có quét đường dẫn thư mục hay không và nếu điều đó có vẻ không tốt cho hiệu suất. Ngoài ra có vẻ như tự động tải chỉ hoạt động đối với Lớp học, một số tệp của tôi không phải là OO. – Nath5

0

Cách tốt nhất để sử dụng các công ước thích hợp đặt tên cho cấu trúc thư mục, các file PHP và tên lớp của tập tin và thiết kế một autoloader để bao gồm các tập tin

+0

Bạn có liên kết tốt với các ví dụ về tạo và tự động tải, tôi khá mới với php và chưa tìm thấy một hướng dẫn hay chưa. – Nath5

+0

http://php.net/manual/en/language.oop5.autoload.php –

+0

Cảm ơn, tôi đã đọc nhưng điều đó dường như chỉ hoạt động với OO, một số tệp của tôi không phải là OO nên tôi đoán phương pháp này đã thắng ' t làm việc. – Nath5

10

Thọ có rất nhiều cách để tìm hiểu con đường tôi luôn luôn tìm thấy nó dễ nhất để xác định một hằng số trong một tập tin trên thư mục gốc của dự án index.php hoặc config sắp xếp. sau đó tôi có thể sử dụng SITE_ROOT để bao gồm/bộ tải lớp ect và SITE_URL cho các chế độ xem, bộ điều khiển, chuyển hướng vv.

<?php 
$root=pathinfo($_SERVER['SCRIPT_FILENAME']); 
define ('BASE_FOLDER', basename($root['dirname'])); 
define ('SITE_ROOT', realpath(dirname(__FILE__))); 
define ('SITE_URL', 'http://'.$_SERVER['HTTP_HOST'].'/'.BASE_FOLDER); 
?> 

Basic class Autoloader

<?php 
function __autoload($class_name) { 
    include (SITE_ROOT.'/includes/'.$class_name.'.php'); 
} 
$obj = new MyClass1(); 
$obj2 = new MyClass2(); 
?> 
+0

Với phương pháp này, không phải tất cả các tệp sẽ sử dụng trình nạp tự động cần bao gồm tệp cấu hình. NẾU đó là cách tốt nhất để làm điều đó bằng cách sử dụng một đường dẫn tương đối như include ('../../ config.php'); Cũng giống như tôi đã đề cập ở trên, công việc này sẽ không nếu OO – Nath5

+0

xác định các hằng số trong tệp chỉ mục của bạn, nó chỉ cần trỏ đến thư mục gốc của bạn, nếu cấu hình của bạn nằm trong thư mục gốc thì tất cả những gì bạn cần là 'include (SITE_ROOT) . '/ config.php') 'bất kể bạn gọi bao hàm sâu bao gồm nó sẽ luôn trỏ đến cùng một tệp. '__autoload' chỉ hoạt động khi gọi các lớp, nó lưu lại khi thực hiện' include (SITE_ROOT. '/ include /'.$ class_name.'. php '); 'cho mỗi lớp, nó rất tiện dụng cho các mô hình trong một mẫu MVC như một bộ điều khiển thường được gọi từ lớp bộ điều khiển/bộ điều khiển phía trước –

+2

Tôi không hiểu cách khắc phục sự cố của mình. Ngay cả khi tôi có mức cấu hình này trong thư mục gốc của tôi, thì nó vẫn cần được bao gồm bằng cách sử dụng các đường dẫn tương đối bằng tất cả các tệp khác của tôi. Một ví dụ về các vấn đề tôi gặp phải là tôi có một lớp ErrorReporter được bao gồm bởi tất cả các tệp khác của tôi nằm ở các mức khác nhau trong cấu trúc thư mục. Bên trong lớp ErrorReporter, tôi có một số đường dẫn nhưng nếu chúng tương đối chúng trở nên tương đối với bất kỳ lớp nào bao gồm ErrorReporter có nghĩa là chúng không liên quan đến cùng một vị trí mỗi lần. – Nath5

0

Khung Zend có một số gợi ý tốt về tối ưu hóa bao gồm đường dẫn:

http://framework.zend.com/manual/1.10/en/performance.classloading.html

Thậm chí nếu bạn không sử dụng khuôn khổ Zend, những là con trỏ tốt. Các bulletpoints chung là:

  • Sử dụng đường dẫn tuyệt đối
  • Giảm số lượng bao gồm đường dẫn bạn xác định
  • Xác định thư mục hiện hành cuối cùng, hoặc không gì cả
  • Xác định Zend Framework của bạn include_path càng sớm càng tốt (không thực sự có liên quan nếu bạn không sử dụng Zend)
Các vấn đề liên quan