页次: 1
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
离线
页次: 1