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