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

CI框架装载器Loader.php源码分析

Jun 06, 2016 pm 08:18 PM
ci框架

前面我们分析了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

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php如何使用CI框架? php如何使用CI框架? Jun 01, 2023 am 08:48 AM

随着网络技术的发展,PHP已经成为了Web开发的重要工具之一。而其中一款流行的PHP框架——CodeIgniter(以下简称CI)也得到了越来越多的关注和使用。今天,我们就来看看如何使用CI框架。一、安装CI框架首先,我们需要下载CI框架并安装。在CI的官网(https://codeigniter.com/)上下载最新版本的CI框架压缩包。下载完成后,解压缩

PHP中如何使用CI框架 PHP中如何使用CI框架 Jun 27, 2023 pm 04:51 PM

PHP是一种流行的编程语言,广泛应用于Web开发。CI(CodeIgniter)框架是PHP中最受欢迎的框架之一,它提供了一整套现成的工具和函数库,以及一些流行的设计模式,让开发人员能够更加高效地开发Web应用程序。本文将介绍使用CI框架开发PHP应用程序的基本步骤和方法。了解CI框架的基本概念和结构在使用CI框架之前,我们需要先了解一些基本的概念和结构。下

php如何使用CI4框架? php如何使用CI4框架? Jun 01, 2023 pm 02:40 PM

PHP是一种广泛使用的服务器端脚本语言,而CodeIgniter4(CI4)是一个流行的PHP框架,它提供了一种快速而优秀的方法来构建Web应用程序。在这篇文章中,我们将通过引导您了解如何使用CI4框架,来使您开始使用此框架来开发出众的Web应用程序。1.下载并安装CI4首先,您需要从官方网站(https://codeigniter.com/downloa

PHP中的CI框架指南 PHP中的CI框架指南 May 22, 2023 pm 07:10 PM

随着互联网的发展和不断地融入人们的生活,网络应用的开发变得越来越重要。PHP作为一种众所周知的编程语言,已经成为了开发互联网应用程序的首选语言之一。而开发人员们可以使用众多的PHP框架来简化开发过程,其中最受欢迎的之一是CodeIgniter(CI)框架。CI是一个强大的PHPweb应用框架,它拥有轻量级、简单易用、优化性能等特点,可以让开发人员快速地构建

ci框架如何引入css ci框架如何引入css Dec 26, 2023 pm 05:20 PM

CI框架中引入CSS样式的步骤如下:1、准备CSS文件;2、将CSS文件存储在CI框架项目的适当位置;3、在需要使用CSS样式的页面中,通过HTML的<link>标签引入CSS文件;4、在HTML元素中使用CSS类或ID名称来应用相应的样式即可。

使用CI框架向网页引入CSS样式的步骤 使用CI框架向网页引入CSS样式的步骤 Jan 16, 2024 am 09:20 AM

CI框架引入CSS样式的步骤,需要具体代码示例CI(CodeIgniter)框架是一种流行的PHP开发框架,被广泛用于构建高效的Web应用程序。在开发Web应用程序时,美观的用户界面是一个重要的考虑因素。使用CSS样式可以达到对Web应用程序界面的优化和个性化,让用户获得更好的体验。在CI框架中,引入CSS样式通常需要以下步骤,并附带具体的代码示例。步骤1:

详解CI框架中引用CSS样式的步骤 详解CI框架中引用CSS样式的步骤 Jan 16, 2024 am 09:28 AM

教程:CI框架中引入CSS样式的详细步骤,需要具体代码示例引言:在开发网页应用程序中,样式是至关重要的一部分。使用CSS(层叠样式表)可以美化网页并提供更好的用户体验。而在使用CodeIgniter(CI)框架进行开发时,如何正确引入CSS样式就显得尤为重要。本文将介绍CI框架中引入CSS样式的详细步骤,并为您提供具体的代码示例。步骤一:创建CSS文件首先,

php如何使用CI6框架? php如何使用CI6框架? Jun 01, 2023 pm 11:10 PM

PHP是一门非常流行的网页开发语言,而CodeIgniter(CI)则是一款非常受欢迎的PHP框架。CodeIgniter提供了很多有用的功能和特性,为开发人员带来了很大的便利。在本文中,我们将探讨如何使用CI6框架。安装CI6在开始使用CI6之前,必须先完成安装过程。您需要首先从CodeIgniter官网下载CI6的压缩包。然后,解压缩这个文件并将其放置在

See all articles