选择语言 :

 Bootstrap::auto_load

自动加载类

boolean Bootstrap::auto_load( string $class_name )

参数列表

参数 类型 描述 默认值
$class_name string $class_name
返回值
  • boolean
File: ./core/bootstrap.php
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;
    }
}