自动加载类
boolean Bootstrap::auto_load( string $class_name )
参数列表
参数 类型 描述 默认值 $class_name
string
$class_name
boolean
public static function auto_load($class_name)
{
if (class_exists($class_name, false))return true;
# 移除两边的
$class_name = strtolower(trim($class_name, '\\ '));
$class_name_array = explode('_', $class_name, 2);
$is_alias = false;
if ($class_name_array[0]=='core' && count($class_name_array)==2)
{
# 系统类库
$ns = 'core';
$new_class_name = $class_name_array[1];
}
else if ($class_name_array[0]=='ex')
{
# 扩展别名
$is_alias = true;
$new_class_name = $class_name_array[1];
}
else if (preg_match('#^library_((?:[a-z0-9]+)_(?:[a-z0-9]+))_([a-z0-9_]+)$#', $class_name, $m))
{
$ns = 'library';
$ns_name = str_replace('_', DS, $m[1]);
$new_class_name = $m[2];
}
else if (preg_match('#^module_(.*)$#', $class_name, $m))
{
# 组件
$ns = 'module';
list($ns_name) = explode('_', $m[1], 2);
$new_class_name = $m[1];
}
else if (preg_match('#^driver_([a-z0-9]+)_driver_([a-z0-9_]+)$#', $class_name, $m))
{
# 驱动
$ns = 'driver';
$ns_name = $m[1];
$new_class_name = $m[2];
}
else
{
$ns = '';
$new_class_name = $class_name;
}
# 获取类的前缀
$prefix = '';
$new_class_arr = explode('_', $new_class_name);
if (count($new_class_arr)>=2)
{
$prefix = array_shift($new_class_arr);
}
if ($prefix && isset(self::$dir_setting[$prefix]))
{
$dir_setting = self::$dir_setting[$prefix];
if ($prefix=='controller')
{
if (IS_SYSTEM_MODE)
{
$dir_setting[0] .= '-system';
}
elseif (IS_CLI)
{
$dir_setting[0] .= '-shell';
}
elseif (IS_ADMIN_MODE)
{
$dir_setting[0] .= '-admin';
}
elseif (IS_REST_MODE)
{
$dir_setting[0] .= '-rest';
}
}
else if ($prefix=='orm')
{
array_pop($new_class_arr);
}
$class_file_name = implode(DS, $new_class_arr);
}
else
{
$dir_setting = self::$dir_setting['class'];
$class_file_name = str_replace('_', DS, $new_class_name);
}
if ($ns)
{
switch ($ns)
{
case 'core':
$file = DIR_CORE . $dir_setting[0] . DS;
break;
case 'module':
$file = DIR_MODULE;
if ($new_class_name==$ns_name)
{
$file .= $ns_name . DS;
}
break;
case 'driver':
$file = DIR_DRIVER . $ns_name . DS;
if (false===strpos($new_class_name, '_'))
{
$file .= $new_class_name . DS;
}
break;
default:
$file = DIR_LIBRARY . $ns_name . DS . $dir_setting[0] . DS;
break;
}
$file .= $class_file_name . $dir_setting[1] . EXT;
if (is_file($file))
{
require $file;
}
}
else
{
if (!$is_alias)
{
# 在include path中找
foreach (array('project', 'team-library') as $type)
{
foreach (self::$include_path[$type] as $path)
{
$tmp_file = $path . $dir_setting[0] . DS . $class_file_name . $dir_setting[1] . EXT;
if (is_file($tmp_file))
{
require $tmp_file;
if (class_exists($class_name, false))return true;
}
}
}
}
$include_path = self::$include_path;
# 没有找到文件且为项目类库,尝试在某个命名空间的类库中寻找
static $module_dir = array();
static $driver_dir = array();
# 处理组件
list($tmp_prefix, $tmp_ns, $tmp_driver) = explode('_', $new_class_name, 4);
if (!isset($module_dir[$tmp_prefix]))
{
$module_dir[$tmp_prefix] = is_dir(DIR_MODULE .$tmp_prefix. DS);
}
if ($module_dir[$tmp_prefix])
{
# 生成一个module路径,比如 Database_Driver_MySQL 就是在 module/database 中
$include_path['module'] = array
(
'module' => DIR_MODULE,
);
}
# 处理驱动
if ($tmp_driver && $tmp_ns=='driver')
{
$driver = $tmp_ns .'/'. $tmp_driver;
if (!isset($driver_dir[$driver]))
{
$driver_dir[$driver] = is_dir(DIR_DRIVER .$tmp_prefix. DS .$tmp_driver. DS);
}
if ($driver_dir[$driver])
{
$include_path['driver'] = array
(
'driver' => DIR_DRIVER,
);
}
}
foreach (array('library', 'driver', 'module', 'core') as $type)
{
foreach ($include_path[$type] as $lib_ns=>$path)
{
$ns_class_name = ($type=='library'?'library_':'') . str_replace('.', '_', $lib_ns) . '_' . $new_class_name;
if (self::auto_load($ns_class_name))
{
if (!$is_alias && class_exists($class_name, false))
{
# 在加载$ns_class_name时,当前需要的类库有可能被加载了,直接返回true
return true;
}
else
{
class_alias($ns_class_name, $class_name);
}
break;
}
}
}
}
if (class_exists($class_name, false))
{
return true;
}
else
{
return false;
}
}