用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4157|回复: 3
收起左侧

[初级] CI学习,边学边记 - Common.php

[复制链接]
发表于 2012-5-12 17:37:42 | 显示全部楼层 |阅读模式
本帖最后由 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 这个函数相对比较复杂一点,主要还是位操作符比较难理解。去看一下



评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2012-7-19 22:05:51 | 显示全部楼层
本帖最后由 viqecel 于 2012-7-19 22:09 编辑


不过下面这句不懂 static $_classes = array();
        // .如果静态属性$_classes 已经设置了要加载的类直接返回
        if (isset($_classes[$class))
        {
                        return $_classes[$class;
        }

既然刚刚声明一个变量$_classes.并规定他为arrary(),则他一定是新的东西.怎么下面还要判断他是否设置? 他刚出生,怎么可能已经设置了加载的类啊.这个判断太多余了吧

发表于 2013-3-30 23:21:03 | 显示全部楼层
我把程序上传到Linux服务器后,提示 Unable to locate the specified class:URI.php
不知道这个是什么情况呢?是什么导致的?
发表于 2013-5-4 11:38:57 | 显示全部楼层
我是個初學者
要好好學習

本版积分规则