2013-02-13 26 views
6

Có cách nào để tôi phân biệt giữa các đặc điểm và các lớp trong chức năng tự động tải của tôi không? Nói rằng tôi có một thư mục các lớp và một thư mục các đặc điểm; sẽ tốt hơn nếu có thể làm một việc gì đó như ...Tự động tải các đặc điểm trong PHP

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

lẽ bạn muốn thay đổi thứ hai 'if' của bạn cho 'elseif' – shnisaka

+0

Không giống có khả năng. Không có thông tin nào ngoài tên biểu tượng được chuyển tới cuộc gọi lại. Bạn có lẽ nên nâng cao lỗi với PHP – Phil

+0

@shnisaka Điều đó không có ý nghĩa gì cả. Tại sao lại sử dụng 'elseif' nếu các điều kiện loại trừ lẫn nhau? – Phil

Trả lời

4

Chức năng gọi lại tự động chỉ nhận được một mẩu thông tin; tên biểu tượng được yêu cầu. Không có cách nào để xem loại biểu tượng nào.

gì bạn có thể làm là đăng ký nhiều chức năng trong autoload ngăn xếp, một để xử lý các lớp học và các đặc điểm khác, sử dụng stream_resolve_include_path() hoặc một cái gì đó tương tự, ví dụ:

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

Cảm ơn, giải pháp nhanh của tôi là sử dụng 'file_exists()'. Tôi đã không bao giờ được sử dụng 'stream_resolve_include_path()' trước và tài liệu là khá mơ hồ ... những gì hiện điều đó làm chính xác? Và những lợi thế gì khi đăng ký hai chức năng tự động tải? –

+0

@savinger Vâng, 'include' sử dụng' include_path' được định cấu hình. 'file_exists()' không biết về điều này trong khi 'stream_resolve_include_path()' thực hiện. Nó trả về 'false' nếu nó không thể giải quyết đường dẫn đã cho dựa vào ngăn xếp' include_path' – Phil

0

Có một giải pháp đơn giản theo cách bạn tên đặc điểm của bạn. Mỗi đặc điểm trong ứng dụng của tôi được đặt tên trait_ (name) và nó được đặt trong thư mục lớp.

Ví dụ: trait_something của tôi được đặt trong lớp/thư mục bên dưới tên tệp "trait.trait_something.php".

chức năng autoload của tôi có thể nhận một trong hai đặc điểm hoặc các lớp:

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
} 
Các vấn đề liên quan