网站开发技术

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

您尚未登录。

#1 2015-03-10 11:02:23

admin
管理员

ci框架中的 load_class 分析

ci框架中的 load_class (ci中load_class 的模拟

首先定义一个静态的变量$_classes 用来存储已经加载过的类。 然后判断如果加载过了.

就直接返回这个类的一个实例。 然后结束。

这个过程中需要用一个 $name 来实现, $names就是  $_classes中的索引。 返回的结果

就是  $_classes[$class] . 

所以下来

有语句  $name = FLASE;这里要开始加载 类。

加载的方式从两个地方。 APPPATH ,这个地方是用户的app下的。 第二个 BASEPATH是系统目录下的。

如果找到了类的文件, 就生产 $name. $name的格式就是  $prefix. $class.

之后加载扩展中的类 和这个做发一样,只是使用了,自定义的前缀设置。

这样,通过$name 是否设置成功就可以判读,想加载的类是否成功了。

最后把加载过的$class保存起来,生成一个实例。 返回。就完成了。

function &load_class($class, $directory = 'libraries', $prefix = 'CI_') {
	static $_classes = array(); // 用来存储已经load过的class
// Does the class exist?  If so, we're done...
// 这里判断要加载的类是否已经加载, 
	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
// 这里加载的类是 libraries 中的类
	foreach (array(APPPATH, BASEPATH) as $path) {
		if (file_exists($path . $directory . '/' . $class . '.php')) {
			$name = $prefix . $class; // 这个只是起一个名字, 方便数组(已经加载过的类)索引
// 这里判断如果有个类 CI 开头的就不再执行 require
			if (class_exists($name) === FALSE) {
				require($path . $directory . '/' . $class . '.php');
			}

			break;
		}
	}

// Is the request a class extension?  If so we load it too
// 这里加载的是扩展中的类,区别是  config_item('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