|
本帖最后由 imwebmaster.net 于 2012-5-12 16:21 编辑
CI版本:2.1.0准备:将CodeIgniter包 重命名为ci ,并放在环境根目录下 , /ci 。
全局函数文件:/ci/system/core/Common.php
功能:提供全局可用的函数 is_php(), load_class() ...
函数:&load_class($class, $directory = 'libraries', $prefix = 'CI_')
PHP复制代码 function &load_class ($class, $directory = 'libraries', $prefix = 'CI_')
{
static $_classes = array();
// .如果静态属性$_classes 已经设置了要加载的类直接返回
if (isset($_classes[$class]))
{
return $_classes[$class];
}
$name = FALSE;
//依次在APPPATH,BASEPATH 查找要加载类所在的文件,找到后包含文件
//依次哦
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;
}
}
// 如果请求了子类,也包含进来
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');
}
}
if ($name === FALSE)
{
//未找到类直接退出
exit('Unable to locate the specified class: '.$class.'.php');
}
// 记录我们刚加载的类名
is_loaded ($class);
//实例化这个类,并返回这个类的实例
$_classes[$class] = new $name();
return $_classes[$class];
}
复制代码
PHP基础
设置为静态作用域static的变量,称为静态变量,静态变量在函数退出后不会丢失值,并且能保留这个值以便再次调用此函数时使用。
在函数load_class 函数中,$_classes 是一个静态数组,在CodeIgniter.php中多次调用了这个函数,$_classes 包含了所有我们加载类的实例 。
看一下CodeIgniter.php 中的一段代码
PHP复制代码
$BM =& load_class('Benchmark', 'core');
$BM->mark('total_execution_time_start');
$BM->mark('loading_time:_base_classes_start')
复制代码
$BM 是啥 , $BM 是$_classes['Benchmark'] 的引用,什么是引用呢? 引用可以认为是变量的别名。 $BM,$_classes['Benchmark'] 指向同一个对象实例,$BM 是$_classes['Benchmark'] 的别名。
同样的,is_load()函数,也是利用静态变量的特性,存储已经加载过类的标示符。没什么好说的。是不是觉得静态作用域很好用啊??
_exception_handler 这个函数相对比较复杂一点,主要还是位操作符比较难理解。去看一下
|
评分
-
查看全部评分
|