改进Loader类的import方法

This commit is contained in:
thinkphp
2016-01-12 21:46:21 +08:00
parent b49a2ed657
commit 03970d0845

View File

@@ -55,7 +55,7 @@ class Loader
$filename = $path . str_replace('\\', DS, $class) . EXT;
if (is_file($filename)) {
// 开启调试模式Win环境严格区分大小写
if (APP_DEBUG && IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)) {
if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . EXT)) {
return;
}
include $filename;
@@ -190,36 +190,42 @@ class Loader
public static function import($class, $baseUrl = '', $ext = EXT)
{
static $_file = [];
$class = str_replace(['.', '#'], ['/', '.'], $class);
$class = str_replace(['.', '#'], [DS, '.'], $class);
if (isset($_file[$class . $baseUrl])) {
return true;
} else {
$_file[$class . $baseUrl] = true;
}
$class_strut = explode('/', $class);
if (empty($baseUrl)) {
if ('@' == $class_strut[0] || MODULE_NAME == $class_strut[0]) {
//加载当前项目应用类库
$class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1);
list($name, $class) = explode(DS, $class, 2);
if (isset(self::$namespace[$name])) {
// 注册的命名空间
$baseUrl = self::$namespace[$name];
} elseif ('@' == $name || MODULE_NAME == $name) {
//加载当前模块应用类库
$baseUrl = MODULE_PATH;
} elseif (in_array($class_strut[0], ['traits', 'think', 'behavior', 'org', 'com'])) {
// org 第三方公共类库 com 企业公共类库
} elseif (in_array($name, ['traits', 'think', 'behavior']) || is_dir(LIB_PATH . $name)) {
$baseUrl = LIB_PATH;
} elseif (in_array($class_strut[0], ['vendor'])) {
$baseUrl = THINK_PATH;
} elseif (is_dir(EXTEND_PATH . $name)) {
$baseUrl = EXTEND_PATH;
} elseif (APP_NAMESPACE == $name) {
// 项目命名空间
$baseUrl = APP_PATH;
} else {
// 加载其他项目应用类库
$class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1);
$baseUrl = APP_PATH . $class_strut[0] . DS;
// 加载其他模块应用类库
$baseUrl = APP_PATH . $name . DS;
}
}
if (substr($baseUrl, -1) != DS) {
} elseif (substr($baseUrl, -1) != DS) {
$baseUrl .= DS;
}
// 如果类存在 则导入类库文件
$filename = $baseUrl . $class . $ext;
if (is_file($filename)) {
// 开启调试模式Win环境严格区分大小写
if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . $ext)) {
return false;
}
include $filename;
return true;
}