Tôi đã thử nghiệm với các kỹ thuật lập bản đồ thư mục lớp tự động tải, và nó đã là một chút của một cuộc đấu tranh. Tôi đã tìm ra một giải pháp khá đơn giản (trên bề mặt), nhưng tôi hoàn toàn băn khoăn rằng nó hoạt động cả, trong khi các giải pháp "rõ ràng hơn" không thành công. Dưới đây là một số đoạn mã minh họa sự nhầm lẫn của tôi.Trình tải tự động của php: tại sao tính năng này hoạt động?
Dưới đây là đoạn code làm việc:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if ([email protected]_once($location . $class . '.php')) { // @ SUPPRESSES include_once WARNINGS
// CLASS DOESN'T EXIST IN THIS DIRECTORY
continue;
} else {
// CLASS IS AUTO-LOADED
break;
}
}
}
?>
Dưới đây là một đoạn mà tôi cảm thấy nên làm việc, nhưng không:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (file_exists($location . $class . '.php')) {
require_once ($location . $class . '.php');
}
}
}
?>
Sau đó có ý nghĩa hơn với tôi bởi vì trong khi hai phiên bản hoạt động:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/sites/' . $class . '.php');
}
?>
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$location = 'classes/sites/';
require_once ($location . $class . '.php');
}
?>
Điều này một lần ném "Không có tệp hoặc thư mục như vậy ..." (lưu ý thiếu "trang web /" trong đường dẫn.
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
Lỗi "Không có tệp hoặc thư mục ..." khiến tôi nghĩ rằng tôi có thể chỉ cần kiểm tra tệp hỗ trợ của lớp và, nếu (file_exists()) {require_once(); break;} else {continue;}
Tại sao tính năng này không hoạt động? Và, tại sao đoạn mã đầu tiên hoạt động? Đường dẫn/tệp hỗ trợ không bao giờ được bao gồm hoặc yêu cầu một cách rõ ràng.
là thư mục mẹ của đường dẫn lớp trong include_paths của bạn? – Orangepill
Tệp hỗ trợ IS được bao gồm, nó chỉ được kết hợp vào câu lệnh if: if (! @include_once ($ location. $ Class. '.php')) –
Vâng, tôi đã nghĩ rằng, john500, nhưng đã hy vọng xác nhận , cảm ơn vì điều đó. Nó cảm thấy như một cách rất cẩu thả để đạt được những gì tôi cần, tuy nhiên, vì vậy điều này chỉ tăng gấp đôi ngứa của tôi để cải thiện các giải pháp. Orangepill, tôi không chắc chắn làm thế nào để làm điều đó ... Tôi đã không làm việc với PHP trong một thời gian, và khi tôi cuối cùng đã làm, tôi không phải là một nửa giỏi lập trình như tôi bây giờ ... vì vậy tôi về cơ bản hack PHP cố gắng để làm những điều tôi đã biết làm thế nào để làm trong Java và Coldfusion;). –