网站开发技术

记点笔记、 学点技术 欢迎交流建站技术。本站关注lamp技术

您尚未登录。

#1 2014-11-26 12:27:10

admin
管理员

ci中是如何加载一个类的 load_class

function &load_class($class, $directory = 'libraries', $prefix = 'CI_') {
    
    // 用来存储程序运行过程中,所有加载过的类,可以有效的减少对文件的读的次数
    static $_classes = array();

    // Does the class exist?  If so, we're done...
    // 如果文件存在了,直接返回就ok
    if (isset($_classes[$class])) {
        return $_classes[$class];
    }

    $name = FALSE;

    // Look for the class first in the local application/libraries folder
    // then in the native system/libraries folder
    
    // 加载文件的时候, 从两个目录中进行加载,一个程序目录, 一个系统目录, 
    // 仅仅加载第一满足条件的
    foreach (array(APPPATH, BASEPATH) as $path) {
        if (file_exists($path . $directory . '/' . $class . '.php')) {
            $name = $prefix . $class;

            if (class_exists($name) === FALSE) {
                require($path . $directory . '/' . $class . '.php');
            }

            break;  // 不管有几个目录里,有个满足条件的就结束。
        }
    }

    // Is the request a class extension?  If so we load it too
    // 如果配置了  subclass_prefix  执行这个, 执行这个了,就不会执行上面的了。 总之只会执行一个。
    if (file_exists(APPPATH . $directory . '/' . config_item('subclass_prefix') . $class . '.php')) {
        $name = config_item('subclass_prefix') . $class;

        if (class_exists($name) === FALSE) {
            require(APPPATH . $directory . '/' . config_item('subclass_prefix') . $class . '.php');
        }
    }

    // Did we find the class?
    // 如果没有满足条件的,就直接退出了。
    if ($name === FALSE) {
        // Note: We use exit() rather then show_error() in order to avoid a
        // self-referencing loop with the Excptions class
        exit('Unable to locate the specified class: ' . $class . '.php');
    }

    // Keep track of what we just loaded
    // 保护已经加载过了
    is_loaded($class);

    $_classes[$class] = new $name();
    return $_classes[$class];
}



ipbbs.net

离线

页脚

Powered by FluxBB