imwebmaster.net 发表于 2012-5-12 17:37:42

CI学习,边学边记 - Common.php

本帖最后由 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_')
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 中的一段代码

        $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 这个函数相对比较复杂一点,主要还是位操作符比较难理解。去看一下



viqecel 发表于 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(),则他一定是新的东西.怎么下面还要判断他是否设置? 他刚出生,怎么可能已经设置了加载的类啊.这个判断太多余了吧

CM帮主 发表于 2013-3-30 23:21:03

我把程序上传到Linux服务器后,提示 Unable to locate the specified class:URI.php
不知道这个是什么情况呢?是什么导致的?

mafly 发表于 2013-5-4 11:38:57

我是個初學者
要好好學習
页: [1]
查看完整版本: CI学习,边学边记 - Common.php