2011-12-13 41 views
15

Tính đến thời điểm này, tôi đã sử dụng các chức năng tự động tải độc lập theo thủ tục và đăng ký chúng với spl_autoload_register() để tự động tải các lớp tên (thường) của tôi. Gần đây, mặc dù, tôi đã nhận thấy mọi người đề cập đến việc sử dụng các lớp autoloader kết hợp với một số khuôn khổ PHP nổi bật.Lớp tự động tải PHP so với chức năng tự động tải thủ tục?

Hầu như tất cả mã của tôi đều hướng đối tượng vào những ngày này, nhưng tôi thực sự không thấy lợi thế khi sử dụng lớp "Trình tải tự động" trên một hàm cơ bản trong trường hợp này. Và xét về khả năng kiểm thử, tôi cảm thấy khá tốt khi sử dụng kiểm tra class_exists() trong các thử nghiệm của mình để xác minh rằng các hàm thủ tục tải tệp chính xác.

Vì vậy, câu hỏi của tôi là ba:

  1. gì ưu điểm hay tính năng (nếu có) có thể gây ảnh hưởng tôi để cấu trúc lại mọi thứ và bắt đầu sử dụng một đối tượng toàn diện các tập tin lớp autoload?
  2. Tôi có thiếu một số lợi thế rõ ràng ở đây bên ngoài các tính năng OOP rõ ràng không?
  3. Bạn có thể tạo trường hợp cho các trình nạp tự động theo thủ tục hoặc lớp học không?

CẬP NHẬT

Dưới đây là một số mã ví dụ cho một chức năng autoload điển hình tôi có thể sử dụng. Đó là metacode, do đó, không tìm lỗi chính tả. Tôi tổ chức các cấu trúc thư mục của mình để chúng phản chiếu các không gian tên. Giả thuyết explode_namespaces() chức năng về mặt lý thuyết có thể được bao gồm như là một phương pháp tĩnh cùng với một phương pháp tĩnh autoload() trong một lớp học, vì vậy đó là một lợi ích. Nó có thể sạch hơn để kết hợp các hàm "tiện ích" khác nhau này làm các phương thức trong một lớp duy nhất.

function autoload($class_name) 
{ 
    $root = APP_LIBS; // a directory path constant set at config time 

    if ($namespaces = explode_namespaces($class_name)) { 

    $domain = array_shift($namespaces); 
    $root .= "/$domain/"; 

    $class_name = array_pop($namespaces); 
    $directories = array(); 

    foreach ($namespaces as $directory) { 
     $directories[] = $directory; 
    } 
    $root .= implode($directories, '/'); 
    } 

    $file = "$root/$class_name.php"; 
    if (file_exists($file)) { 
    include $file; 
    } 
} 
+0

Tôi đã xóa phần "câu trả lời" khỏi câu hỏi của bạn vì câu hỏi này không liên quan đến câu hỏi đó. Bạn nên xem xét thêm câu trả lời của riêng bạn, nó có thể sẽ giúp những người khác :) – James

Trả lời

4

Bạn đang so sánh các hàm với phương pháp. Đó chỉ là cú pháp.

Trừ khi bạn có trình tải tự động dựa trên bản đồ hoặc bảng phụ thuộc có sẵn, bạn không cần bất kỳ thuộc tính cấp lớp nào để theo dõi mọi thứ (hoặc có thể sử dụng các biến tĩnh hoặc toàn cục khác). Khả năng cấu hình lại thời gian chạy cũng không thực sự cần thiết trong thực tế.

Bạn có thể tạo một trình tự động định cấu hình dự án có thể định cấu hình với các hằng số ... Có các đặc tính của hàm tạo không phải là một lợi ích đáng kể để tái sử dụng với việc triển khai phương thức. Nó chỉ có thể trông đẹp hơn một chút.

0

Sử dụng bộ dựng sẵn nếu bạn đã sử dụng một phần chính khác của khung, nếu không thì nó không quan trọng.

Ngoài ra, sử dụng một bộ nạp tự động, với nhiều không gian tên/thư mục đã đăng ký sẽ giảm bộ nhớ bao giờ hết, nhưng đó không thực sự là một mối quan tâm.

+0

Cảm ơn bạn đã phản hồi. Tôi không sử dụng các khuôn khổ đã nói. Tôi thường thích anh đào chọn các tính năng yêu thích của tôi từ các khung công tác khác nhau và tôi không muốn có một cuộc thảo luận "Bạn nên sử dụng khung" :) Ngoài ra, tôi hiện đang chỉ sử dụng một trình nạp tự động .. Giới thiệu về cập nhật câu hỏi với mã mẫu . – rdlowrey

Các vấn đề liên quan