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:
- 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?
- 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?
- 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;
}
}
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