2011-11-23 10 views
8

Hiện tại tôi đang tải tất cả các lớp của mình bằng cách bao gồm tệp "all.inc.php" trên mỗi trang của trang web, tệp này sau đó bao gồm tất cả cấu hình, lớp, chức năng, v.v. toàn bộ trang web.Có những nhược điểm về hiệu năng trong khi sử dụng các lớp tự động nạp trong PHP không?

Vấn đề của tôi với điều này là tôi thường sử dụng các lớp chỉ liên quan đến một số trang/phần nhất định của trang web, vì vậy thường tôi bao gồm một loạt các lớp ở đầu trang sẽ không được sử dụng.

Rõ ràng tự động tải các lớp sẽ khắc phục vấn đề này, vì vậy câu hỏi của tôi là, sẽ tự động tải các lớp cho tôi một nhược điểm như máy chủ sau đó phải kiểm tra xem tệp có tồn tại không? Và nếu có một nhược điểm, thì nhược điểm này tồi tệ hơn là phải bao gồm một số lớp có thể không được sử dụng trên trang? Hoặc là sự khác biệt tiêu cực?

Trả lời

9

Bài viết này có một số thông tin và điểm chuẩn: PHP autoload performance. Kết luận:

Tự động tải không làm giảm đáng kể hiệu suất. Việc tìm kiếm Include_path, đọc và phân tích cú pháp các tập lệnh PHP từ đĩa mất nhiều thời gian hơn so với chi phí logic tự động tải trần.

+0

Cảm ơn, bài viết đó là loại giải thích mà tôi đang tìm kiếm! – Nick

+0

Câu trả lời ngắn: không thực sự (đó là một hiệu suất nhỏ hit), không, và có :) – siliconrockstar

5

Tự động tải lớp học gần như nhanh như bao gồm cả lớp theo cách thông thường. Chuyển sang tự động tải sẽ cải thiện hiệu suất trong trường hợp của bạn, vì PHP tải ít tệp và lớp hơn.

+3

Mặc dù đặc tính này là chính xác nhưng nó phụ thuộc vào cơ sở mã. Nếu cơ sở mã của bạn được kết hợp chặt chẽ, và các lớp dựa vào nhau, có thể không có lợi ích để tự động tải, vì hầu hết (hoặc tất cả) của các lớp có thể được tải anyways.Chỉ là một suy nghĩ ;-) –

1

Mỗi số include()require() (và _once anh chị em) của họ tự mình thực hiện hình phạt. Đĩa tìm kiếm và đọc cũng đi kèm với chi phí. Nó thực sự phụ thuộc vào mã của bạn, nếu bạn đang tải 20 lớp học nhưng chỉ sử dụng 2 hoặc 3 tại bất kỳ điểm duy nhất nào, thì chắc chắn giá trị sẽ đi theo tuyến tải tự động.

Nếu hiệu suất là mối quan tâm chính của bạn, bạn nên xem xét hợp nhất các tệp lớp học của mình thành một tệp và khởi tạo những gì bạn cần.

+2

Ném tấn của các lớp học vào một tập tin duy nhất là thực hành khá xấu. – burzum

+0

@burzum và tại sao điều đó lại là? –

+0

http://en.wikipedia.org/wiki/Separation_of_concerns – burzum

3

Tự động tải sẽ cải thiện hiệu suất nếu tập lệnh không phải tìm kiếm tệp mỗi lần trong hệ thống tệp. Nếu bạn sử dụng không gian tên, bạn có thể có một ánh xạ đẹp của không gian tên và tên lớp cho một thư mục và tệp như Some/Nice/ClassName sẽ ánh xạ tới Some/Nice/ClassName.php.

Nếu bạn không sử dụng không gian tên và phải tìm kiếm thông qua các thư mục Tôi đề nghị bạn tạo một lớp tùy chỉnh singleton để bao gồm các file cho phép bạn làm điều gì đó như:

App :: sử dụng ('Một số/đẹp' , 'Tên lớp');

Trong Tự động tải sử dụng đường dẫn đã đăng ký và tên lớp để ánh xạ đường dẫn và tệp kết hợp cả hai arg từ phương thức sử dụng trong ví dụ của tôi. Điều này sẽ cho phép bạn một số chức năng như không gian tên để tải lớp cho đến khi bạn sẵn sàng thay đổi ứng dụng của mình để sử dụng không gian tên.

2

Bạn nên sử dụng tính năng tự động tải với chỉ mục bộ nhớ cache của tất cả các lớp/tệp khả dụng trong dự án.

Ví dụ:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php', 
    'Item'=>'model/Item.php' 
); 

function __autoload($class_name) { 
if(array_key_exists($class_name)) 
    include $class_cache[$class_name]; 
else 
    throw new Exception("Unable to load $class_name."); 
} 

Bạn cần phải giữ danh sách lớp thực tế hoặc viết một số máy phát điện với $ class_cache.

+0

Cảm ơn mã ví dụ, nhưng tất cả các lớp của tôi tuân theo quy ước đặt tên giống nhau và sẽ khớp với tên lớp khá dễ dàng, vì vậy tôi không nghĩ rằng một mảng phù hợp với chúng là giải pháp tốt nhất. Bây giờ tôi chắc chắn rằng tôi sẽ sử dụng autoload mặc dù! Vì vậy, nhờ bạn (và những người khác) cho những lời giải thích. – Nick

+0

Ok, nhưng nếu bạn viết trình tạo tự động cho $ class_cache và chạy nó trước khi triển khai Bạn sẽ kiểm tra đĩa cho các tệp php có sẵn chỉ một lần tại quá trình triển khai, không phải trên mọi yêu cầu. – rogal111