搜索
首页php教程php手册CI框架装载器Loader.php源码分析

前面我们分析了CI框架的session类和安全类文件,今天我们来分析下CI框架的装载器Loader.php文件的源码

顾名思义,装载器就是加载元素的,使用CI时,经常加载的有:

$this->load->library()
$this->load->view()
$this->load->model()
$this->load->database()
$this->load->helper()
$this->load->config()
$this->load->add_package_path()

复制代码 代码如下:


/**
 * Loader Class
 *
 * 用户加载views和files,常见的函数有model(),view(),library(),helper()
 *
 * Controller的好助手,$this->load =& load_class('Loader', 'core');,加载了loader,Controller就无比强大了
 */
CI_Loader 类 {
 受保护的$_ci_ob_level;
 protected $_ci_view_paths = array();
 protected $_ci_library_paths = array();
 protected $_ci_model_paths = array();
 protected $_ci_helper_paths = array();
 受保护的 $_base_classes = array(); // 由控制器类
设置  protected $_ci_cached_vars = array();
 protected $_ci_classes   = array();
 protected $_ci_loaded_files = array();
 
 protected $_ci_models   = array();
 protected $_ci_helpers   = array();
 protected $_ci_varmap   = array('unit_test' => 'unit',
           'user_agent'=>; '代理');
 公共函数 __construct()
 {      
                //获取缓冲级别
  $this->_ci_ob_level = ob_get_level();
  //库路径
                $this->_ci_library_paths = array(APPPATH, BASEPATH);
                //帮助路径
  $this->_ci_helper_paths = array(APPPATH, BASEPATH);
                //模型路径
  $this->_ci_model_paths = array(APPPATH);
                //查看路径
  $this->_ci_view_paths = array(APPPATH.'views/' => TRUE);
  log_message('debug', "加载器类已初始化");
 }
 // ------------------------------------------------ --------------------
 /**
  * 初始化Loader
  *
 */
 公共函数initialize()
 {
  $this->_ci_classes = array();
  $this->_ci_loaded_files = array();
  $this->_ci_models = array();
                //将is_loaded(common中加载记录核心类函数)加载的核心类排序_base_classes
  $this->_base_classes =& is_loaded();
                //加载autoload.php配置中文件
  $this->_ci_autoloader();
  返回 $this;
 }
 // ------------------------------------------------ --------------------
 /**
  * 检测类是否加载
 */
 公共函数 is_loaded($class)
 {
  if (isset($this->_ci_classes[$class]))
  {
   返回 $this->_ci_classes[$class];
  }
  返回FALSE;
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载Class
 */
 公共函数库($library = '', $params = NULL, $object_name = NULL)
 {
  if (is_array($library))
  {
   foreach($library 作为 $class)
   {
    $this->library($class, $params);
   }
   返回;
  }
                //如果$library为空或者已经加载。。。
  if ($library == '' OR isset($this->_base_classes[$library]))
  {
   返回FALSE;
  }
  if ( ! is_null($params) && ! is_array($params))
  {
   $params = NULL;
  }
  $this->_ci_load_class($library, $params, $object_name);
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载和实例化model
 */
 公共函数模型($model, $name = '', $db_conn = FALSE)
 {
                //CI支持负载加载多个模型
  if (is_array($model))
  {
   foreach($model 为 $babe)
   {
    $this->model($babe);
   }
   返回;
  }
  if ($model == '')
  {
   返回;
  }
  $path = '';
  // 是否存在子目录
  if (($last_slash = strrpos($model, '/')) !== FALSE)
  {
   // 路径在最后一个斜杠前面
   $path = substr($model, 0, $last_slash 1);
   // 以及后面的型号名称
   $model = substr($model, $last_slash 1);
  }
  if ($name == '')
  {
   $name = $model;
  }
  if (in_array($name, $this->_ci_models, TRUE))
  {
   返回;
  }
  $CI =& get_instance();
  if (isset($CI->$name))
  {
   show_error('您正在加载的模型名称是已在使用的资源名称:'.$name);
  }
  $模型 = strtolower($模型); //模型文件名全小写
  foreach ($this->_ci_model_paths as $mod_path)
  {
   if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
   {
    继续;
   }
   if ($db_conn !== FALSE AND !class_exists('CI_DB'))
   {
    if ($db_conn === TRUE)
    {
     $db_conn = '';
    }
    $CI->加载->数据库($db_conn, FALSE, TRUE);
   }
   if ( !class_exists('CI_Model'))
   {
    load_class('模型', '核心');
   }
   require_once($mod_path.'models/'.$path.$model.'.php');
   $model = ucfirst($model);
   $CI->$name = new $model();
                        //保存在Loader::_ci_models中,以后可以用它来判断某个模型是否已经加载过。
   $this->_ci_models[] = $name;
   返回;
  }
  // 找不到模型
  show_error('无法找到您指定的模型:'.$model);
 }
 // ------------------------------------------------ --------------------
 /**
  * 数据库Loader
 */
 公共函数数据库($params = '', $return = FALSE, $active_record = NULL)
 {
  // 获取超级对象
  $CI =& get_instance();
  // 是否需要加载db
  if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db))
  {
   返回FALSE;
  }
  require_once(BASEPATH.'database/DB.php');
  if ($return === TRUE)
  {
   return DB($params, $active_record);
  }
  // 初始化db变量。  需要预防
  // 某些配置的引用错误
  $CI->db = '';
  // 加载数据库类
  $CI->db =& DB($params, $active_record);
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载数据库工具类
 */
 公共函数 dbutil()
 {
  if ( !class_exists('CI_DB'))
  {
   $this->数据库();
  }
  $CI =& get_instance();
  // 为了向后兼容,加载 dbforge,这样我们就可以扩展 dbutils
  // 这种用法已被弃用并强烈反对
  $CI->load->dbforge();
  require_once(BASEPATH.'database/DB_utility.php');
  require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility.php');
  $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
  $CI->dbutil = new $class();
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载Database Forge类
  *
  * @return 字符串
 */
 公共函数 dbforge()
 {
  if ( !class_exists('CI_DB'))
  {
   $this->数据库();
  }
  $CI =& get_instance();
  require_once(BASEPATH.'database/DB_forge.php');
  require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php');
  $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
  $CI->dbforge = new $class();
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载视图文件
 */
 公共函数 view($view, $vars = array(), $return = FALSE)
 {
  return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载普通文件
 */
 公共函数文件($path, $return = FALSE)
 {
  return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
 }
 // ------------------------------------------------ --------------------
 /**
  * 设置变量
  *
  * 设置变量后,它们将在
内可用   * 控制器类及其“视图”文件。
  *
 */
 公共函数 vars($vars = array(), $val = '')
 {
  if ($val != '' AND is_string($vars))
  {
   $vars = array($vars => $val);
  }
  $vars = $this->_ci_object_to_array($vars);
  if (is_array($vars) AND count($vars) > 0)
  {
   foreach ($vars as $key => $val)
   {
    $this->_ci_cached_vars[$key] = $val;
   }
  }
 }
 // ------------------------------------------------ --------------------
 /**
  * 检查并获取变量
 */
 公共函数 get_var($key)
 {
  返回 isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载helper
 */
 公共函数助手($helpers = array())
 {
  foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)
  {
   if (isset($this->_ci_helpers[$helper]))
   {
    继续;
   }
   $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php';
   // 如果是扩展助手的话
   if (file_exists($ext_helper))
   {
    $base_helper = BASEPATH.'helpers/'.$helper.'.php';
    if ( !file_exists($base_helper))
    {
     show_error('无法加载请求的文件:helpers/'.$helper.'.php');
    }
    include_once($ext_helper);
    include_once($base_helper);
    $this->_ci_helpers[$helper] = TRUE;
    log_message('debug', '帮助程序已加载: '.$helper);
    继续;
   }
   // 如果不是扩展helper,helper路径中加载helper
   foreach ($this->_ci_helper_paths as $path)
   {
    if (file_exists($path.'helpers/'.$helper.'.php'))
    {
     include_once($path.'helpers/'.$helper.'.php');
     $this->_ci_helpers[$helper] = TRUE;
     log_message('debug', '帮助程序已加载: '.$helper);
     休息;
    }
   }
   // 如果该helper还没加载成功的话,说明加载helper失败
   if ( ! isset($this->_ci_helpers[$helper]))
   {
    show_error('Unable to load the requested file: helpers/'.$helper.'.php');
   }
  }
 }
 // --------------------------------------------------------------------
 /**
  * 可以看到helpers调用也是上面的helper,只是helpers的别名而已
 */
 public function helpers($helpers = array())
 {
  $this->helper($helpers);
 }
 // --------------------------------------------------------------------
 /**
  * 加载language文件
 */
 public function language($file = array(), $lang = '')
 {
  $CI =& get_instance();
  if ( ! is_array($file))
  {
   $file = array($file);
  }
  foreach ($file as $langfile)
  {
   $CI->lang->load($langfile, $lang);
  }
 }
 // --------------------------------------------------------------------
 /**
  * 加载配置文件
 */
 public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
 {
  $CI =& get_instance();
  $CI->config->load($file, $use_sections, $fail_gracefully);
 }
 // --------------------------------------------------------------------
 /**
  * Driver
  *
  * 加载 driver library
 */
 public function driver($library = '', $params = NULL, $object_name = NULL)
 {
  if ( ! class_exists('CI_Driver_Library'))
  {
   // we aren't instantiating an object here, that'll be done by the Library itself
   require BASEPATH.'libraries/Driver.php';
  }
  if ($library == '')
  {
   return FALSE;
  }
  // We can save the loader some time since Drivers will *always* be in a subfolder,
  // and typically identically named to the library
  if ( ! strpos($library, '/'))
  {
   $library = ucfirst($library).'/'.$library;
  }
  return $this->library($library, $params, $object_name);
 }
 // --------------------------------------------------------------------
 /**
  * 添加 Package 路径
  *
  * 把package路径添加到库,模型,助手,配置路径
 */
 public function add_package_path($path, $view_cascade=TRUE)
 {
  $path = rtrim($path, '/').'/';
  array_unshift($this->_ci_library_paths, $path);
  array_unshift($this->_ci_model_paths, $path);
  array_unshift($this->_ci_helper_paths, $path);
  $this->_ci_view_paths = array($path.'views/' => $view_cascade) $this->_ci_view_paths;
  $config =& $this->_ci_get_component('config');
  array_unshift($config->_config_paths, $path);
 }
 // --------------------------------------------------------------------
 /**
  * 获取Package Paths,,默认不包含BASEPATH
 */
 public function get_package_paths($include_base = FALSE)
 {
  return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths;
 }
 // --------------------------------------------------------------------
 /**
  * 清晰除包路径
  *
  * 从库、模型和辅助路径数组中删除路径(如果存在)
  * 如果没有提供路径,则删除最近添加的路径。
  *
 */
 public function remove_package_path($path = '', $remove_config_path = TRUE)
 {
  $config =& $this->_ci_get_component('config');
  if ($path == '')
  {
   $void = array_shift($this->_ci_library_paths);
   $void = array_shift($this->_ci_model_paths);
   $void = array_shift($this->_ci_helper_paths);
   $void = array_shift($this->_ci_view_paths);
   $void = array_shift($config->_config_paths);
  }
  其他
  {
   $path = rtrim($path, '/').'/';
   foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
   {
    if (($key = array_search($path, $this->{$var})) !== FALSE)
    {
     取消设置($this->{$var}[$key]);
    }
   }
   if (isset($this->_ci_view_paths[$path.'views/']))
   {
    取消设置($this->_ci_view_paths[$path.'views/']);
   }
   if (($key = array_search($path, $config->_config_paths)) !== FALSE)
   {
    取消设置($config->_config_paths[$key]);
   }
  }
  // 保证应用默认的路径依然存在
  $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
  $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
  $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
  $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
  $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
 }
 // ------------------------------------------------ --------------------
 /**
  * 装载机
  *
  * 该函数用于加载视图和文件。
  * 变量以 _ci_ 为前缀以避免与
符号冲突   * 可用于查看文件的变量
  *
  * @param数组
  * @return void
 */
 受保护函数 _ci_load($_ci_data)
 {
  // 设置默认数据变量
  foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
  {
   $$_ci_val = (!isset($_ci_data[$_ci_val])) ?假:$_ci_data[$_ci_val];
  }
  $file_exists = FALSE;
                //如果$_ci_path不为空,则说明当前要加载普通文件。Loader::file会有path
  if ($_ci_path != '')
  {
   $_ci_x = 爆炸('/', $_ci_path);
   $_ci_file = end($_ci_x);
  }
  其他
  {
   $_ci_ext = 路径信息($_ci_view, PATHINFO_EXTENSION);
   $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;
   foreach ($this->_ci_view_paths as $view_file => $cascade)
   {
    if (file_exists($view_file.$_ci_file))
    {
     $_ci_path = $view_file.$_ci_file;
     $file_exists = TRUE;
     休息;
    }
    if ( !$cascade)
    {
     休息;
    }
   }
  }
                //view文件不存在底部报错
  if ( ! $file_exists && ! file_exists($_ci_path))
  {
   show_error('无法加载请求的文件:'.$_ci_file);
  }
  // 把CI的所有属性都传递给loader,view中$this指的是loader
  $_ci_CI =& get_instance();
  foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
  {
   if ( !isset($this->$_ci_key))
   {
    $this->$_ci_key =& $_ci_CI->$_ci_key;
   }
  }
  /*
   * 提取并缓存变量
   *
   * 您可以使用专用的 $this->load_vars()
设置变量    * 函数或通过该函数的第二个参数。我们会合并
   * 这两种类型并缓存它们,以便嵌入
中的视图   * 其他视图可以访问这些变量。
   */
  if (is_array($_ci_vars))
  {
   $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
  }
  提取($this->_ci_cached_vars);
  /*
   * 将视图内容放置存储区
   *
   */
  ob_start();
  //支持短标签
  if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
  {
   echo eval('?>'.preg_replace("/;*s*?>/", "; ?>", str_replace('=', '   }
  其他
  {
   包括($_ci_path); // include() 与 include_once() 允许多个同名视图
  }
  log_message('debug', '文件已加载:'.$_ci_path);
  // 是否直接返回viewdata
  if ($_ci_return === TRUE)
  {
   $buffer = ob_get_contents();
   @ob_end_clean();
   返回 $buffer;
  }
  //当前这个视图文件是被另一个视图文件通过$this->view()方法引入,即视图文件嵌入视图文件
  if (ob_get_level() > $this->_ci_ob_level 1)
  {
   ob_end_flush();
  }
  其他
  {       //// 将秋天的内容休眠输出组件并清空关闭秋天。
   $_ci_CI->输出->append_output(ob_get_contents());
   @ob_end_clean();
  }
 }
 // ------------------------------------------------ --------------------
 /**
  * 加载类
 */
 受保护函数 _ci_load_class($class, $params = NULL, $object_name = NULL)
 {
  // 去掉.php和端点的/获取的$class就是类名或目录名 类名
  $class = str_replace('.php', '', trim($class, '/'));
  // CI 允许dir/filename 方式
  $subdir = '';
  if (($last_slash = strrpos($class, '/')) !== FALSE)
  {
   // 目录
   $subdir = substr($class, 0, $last_slash 1);
   // 文件名
   $class = substr($class, $last_slash 1);
  }
  // 允许加载的类名首字母大写或全小写
  foreach (array(ucfirst($class), strtolower($class)) as $class)
  {
   $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';
   // 是否是扩展类
   if (file_exists($subclass))
   {
    $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php';
    if ( !file_exists($baseclass))
    {
     log_message('error', "无法加载请求的类:".$class);
     show_error("无法加载请求的类:".$class);
    }
    // 安全性:该类是否已被之前的调用加载?
    if (in_array($subclass, $this->_ci_loaded_files))
    {
     // 在我们认为这是重复请求之前,让我们看看
     // 如果提供自定义对象名称。  如果是的话,我们会
     // 返回对象的新实例
     if ( !is_null($object_name))
     {
      $CI =& get_instance();
      if ( !isset($CI->$object_name))
      {
       return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
      }
     }
     $is_duplicate = TRUE;
     log_message('debug', $class." 类已经加载。第二次尝试被忽略。");
     返回;
    }
    include_once($baseclass);
    include_once($subclass);
    $this->_ci_loaded_files[] = $subclass;
                                //实例化类
    return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
   }
   // 如果不是扩展,和上面类似
   $is_duplicate = FALSE;
   foreach ($this->_ci_library_paths as $path)
   {
    $filepath = $path.'libraries/'.$subdir.$class.'.php';
    // 文件是否存在?  不?  真糟糕...
    if ( ! file_exists($filepath))
    {
     继续;
    }
    // 安全性:该类是否已被之前的调用加载?
    if (in_array($filepath, $this->_ci_loaded_files))
    {
     // 在我们认为这是重复请求之前,让我们看看
     // 如果提供自定义对象名称。  如果是的话,我们会
     // 返回对象的新实例
     if ( !is_null($object_name))
     {
      $CI =& get_instance();
      if ( !isset($CI->$object_name))
      {
       return $this->_ci_init_class($class, '', $params, $object_name);
      }
     }
     $is_duplicate = TRUE;
     log_message('debug', $class." 类已经加载。第二次尝试被忽略。");
     返回;
    }
    include_once($文件路径);
    $this->_ci_loaded_files[] = $filepath;
    return $this->_ci_init_class($class, '', $params, $object_name);
   }
  } // 结束 FOREACH
  // 如果还没有找到该类,最后的尝试是该类会不会在同名的子目录下
  if ($subdir == '')
  {
   $path = strtolower($class).'/'.$class;
   返回 $this->_ci_load_class($path, $params);
  }
  // 加载失败,报错
  if ($is_duplicate == FALSE)
  {
   log_message('error', "无法加载请求的类:".$class);
   show_error("无法加载请求的类:".$class);
  }
 }
 // ------------------------------------------------ --------------------
 /**
  * 实例化已经加载的类
 */
 受保护函数 _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
 {
  // 是否有类的配置信息
  if ($config === NULL)
  {
   // 获取包含任何包路径的配置路径
   $config_component = $this->_ci_get_component('config');
   if (is_array($config_component->_config_paths))
   {
    // 在第一个找到的文件上中断,从而打包文件
    // 不会被默认路径覆盖
    foreach ($config_component->_config_paths as $path)
    {
     // 我们测试大写和小写,对于
的服务器      // 文件名区分大小写。检查环境
     // 首先,全局下一个
     if (define('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
     {
      include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');
      休息;
     }
     elseif (已定义('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
     {
      include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');
      休息;
     }
     elseif (file_exists($path .'config/'.strtolower($class).'.php'))
     {
      include($path .'config/'.strtolower($class).'.php');
      休息;
     }
     elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php'))
     {
      include($path .'config/'.ucfirst(strtolower($class)).'.php');
      休息;
     }
    }
   }
  }
  if ($prefix == '')
  {       //系统下库
   if (class_exists('CI_'.$class))
   {
    $name = 'CI_'.$class;
   }
   elseif (class_exists(config_item('subclass_prefix').$class))
   {       //扩展库
    $name = config_item('subclass_prefix').$class;
   }
   其他
   {
    $name = $class;
   }
  }
  其他
  {
   $name = $prefix.$class;
  }
  // 类名有效吗?
  if ( !class_exists($name))
  {
   log_message('error', "不存在的类: ".$name);
   show_error("不存在的类:".$class);
  }
  // 设置变量名称,我们将把类分配给
  // 是否提供了自定义类名?  如果是的话我们就用它
  $class = strtolower($class);
  if (is_null($object_name))
  {
   $classvar = (!isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
  }
  其他
  {
   $classvar = $object_name;
  }
  // 保存类名和对象名
  $this->_ci_classes[$class] = $classvar;
  // 将初始化类的实例给CI超级句柄
  $CI =& get_instance();
  if ($config !== NULL)
  {
   $CI->$classvar = new $name($config);
  }
  其他
  {
   $CI->$classvar = new $name;
  }
 }
 // ------------------------------------------------ --------------------
 /**
  * 自动加载器
         *
         * autoload.php配置的自动加载文件有:
         *  | 1. Packages
            | 2. Libraries
            | 3. Helper files
            | 4. Custom config files
            | 5. Language files
            | 6. Models
 */
 私有函数_ci_autoloader()
 {
  if (define('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
  {
   include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
  }
  其他
  {
   include(APPPATH.'config/autoload.php');
  }
  if ( !isset($autoload))
  {
   返回FALSE;
  }
  //自动加载packages,将package_path加入library,model,helper,config
  if (isset($autoload['packages']))
  {
   foreach ($autoload['packages'] as $package_path)
   {
    $this->add_package_path($package_path);
   }
  }
  // 加载配置文件
  if (count($autoload['config']) > 0)
  {
   $CI =& get_instance();
   foreach ($autoload['config'] as $key => $val)
   {
    $CI->config->load($val);
   }
  }
  // 加载助手和语言
  foreach (array('helper', '语言') as $type)
  {
   if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
   {
    $this->$type($autoload[$type]);
   }
  }
  // 这个希望是为了兼容以前版本的
  if ( !isset($autoload['libraries']) AND isset($autoload['core']))
  {
   $autoload['libraries'] = $autoload['core'];
  }
  // 加载库
  if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
  {
   // 加载数据库
   if (in_array('database', $autoload['libraries']))
   {
    $this->数据库();
    $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
   }
   // 加载所有其他库
   foreach ($autoload['libraries'] as $item)
   {
    $this->库($item);
   }
  }
  // 自动加载模型
  if (isset($autoload['model']))
  {
   $this->model($autoload['model']);
  }
 }
 // ------------------------------------------------ --------------------
 /**
  * 返回由对象属性组成的关联数组
 */
 受保护函数 _ci_object_to_array($object)
 {
  返回(is_object($object))? get_object_vars($object) : $object;
 }
 // ------------------------------------------------ --------------------
 /**
  * 获取CI某个组件的实例
 */
 受保护函数 &_ci_get_component($component)
 {
  $CI =& get_instance();
  返回 $CI->$component;
 }
 // ------------------------------------------------ --------------------
 /**
  * 处理文件名,这个函数主要是返回正确文件名
 */
 受保护函数 _ci_prep_filename($filename, $extension)
 {
  if ( !is_array($filename))
  {
   return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension));
  }
  其他
  {
   foreach ($filename as $key => $val)
   {
    $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension);
   }
   返回$文件名;
  }
 }
}

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中