CI 3.1.3 源码分析(一)

仅是自己分析源码时的笔记参考 并不是教程之类的文章

  1. 入口文件index.php

    主要定义了报错类型以及设置各种路径常量 

  2. CodeIgniter.php

    1. load application文件夹下的常量文件(constants .php)

    load system  文件夹下的common.php

    自定义加载目录下的class,默认加载libraries目录下的class,首先加载core/下的,然后加载application/下的

    默认用“CI_”这个prefix,其次使用自定义prefix 例如“MY_”

    function &load_class($class, $directory = 'libraries', $param = NULL)
    {
       static $_classes = array();
    
       // 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
       foreach (array(APPPATH, BASEPATH) as $path)
       {
          if (file_exists($path.$directory.'/'.$class.'.php'))
          {
             $name = 'CI_'.$class;
    
             if (class_exists($name, FALSE) === FALSE)
             {
                require_once($path.$directory.'/'.$class.'.php');
             }
    
             break;
          }
       }
    
       // Is the request a class extension? If so we load it too
       if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))
       {
          $name = config_item('subclass_prefix').$class;
    
          if (class_exists($name, FALSE) === FALSE)
          {
             require_once(APPPATH.$directory.'/'.$name.'.php');
          }
       }
    
       // Did we find the class?
       if ($name === FALSE)
       {
          // Note: We use exit() rather than show_error() in order to avoid a
          // self-referencing loop with the Exceptions class
          set_status_header(503);
          echo 'Unable to locate the specified class: '.$class.'.php';
          exit(5); // EXIT_UNK_CLASS
       }
    
       // Keep track of what we just loaded
       is_loaded($class);
    
       $_classes[$class] = isset($param)
          ? new $name($param)
          : new $name();
       return $_classes[$class];
    }

      然后加载config文件,默认加载Application目录下config/config.php,找不到才会检查config.php是否再自定义的路径里

function &get_config(Array $replace = array())
{
   static $config;

   if (empty($config))
   {
      $file_path = APPPATH.'config/config.php';
      $found = FALSE;
      if (file_exists($file_path))
      {
         $found = TRUE;
         require($file_path);
      }

      // Is the config file in the environment folder?
      if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
      {
         require($file_path);
      }
      elseif ( ! $found)
      {
         set_status_header(503);
         echo 'The configuration file does not exist.';
         exit(3); // EXIT_CONFIG
      }

      // Does the $config array exist in the file?
      if ( ! isset($config) OR ! is_array($config))
      {
         set_status_header(503);
         echo 'Your config file does not appear to be formatted correctly.';
         exit(3); // EXIT_CONFIG
      }
   }

   // Are any values being dynamically added or replaced?
   foreach ($replace as $key => $val)
   {
      $config[$key] = $val;
   }

   return $config;
}

基本上其他的function 都是一些基础function简单过一下就看完了

下面要看的是core/libraries文件夹下的这些类库了