我一直在嘗試使用自動加載器的類目錄映射技術,這已經有點困難了。我試圖想出一個相當簡單的解決方案(表面上),但我完全不知道它可以工作,而其他「更明顯」的解決方案卻失敗了。下面是一些代碼片段,說明了我的困惑。php自動加載器:爲什麼這個工作?
這裏的工作代碼:
<?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;
}
}
}
?>
這裏的,我覺得應該工作的摘要,但不會:
<?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');
}
}
}
?>
後者更有意義,我因爲在這兩個版本工作:
<?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');
}
?>
This one throws 「沒有這樣的文件或目錄...」(注意路徑中缺少「網站/」。
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
的「沒有這樣的文件或目錄...」錯誤讓我覺得我可以簡單地檢查一類的支持文件,如果(file_exists()){require_once(); break;} else {continue;}
爲什麼不行?而且,爲什麼第一個片段能夠工作?支持路徑/文件從未明確包含或不需要。
是include_paths中類路徑的父目錄嗎? – Orangepill
包括的支持文件,它只是合併到if語句中:if(!@include_once($ location。$ class。'.php')) –
是的,我有點想,john500,但希望確認,非常感謝。儘管如此,這感覺就像是一種非常sl way的方式,所以這只是使我的癢感改善了解決方案。我不知道該怎麼做......我一段時間都沒有和PHP一起工作,而當我上一次做的時候,我的編程和現在一樣不是我的一半......所以我基本上黑客攻擊PHP試圖做我已經知道如何在Java和ColdFusion中做的事情;)。 –