|  | 
 
| 本帖最后由 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 这个函数相对比较复杂一点,主要还是位操作符比较难理解。去看一下
 
 
 
 
 | 
 评分
查看全部评分
 |