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


Posted in PHP onNovember 04, 2014

顾名思义,装载器就是加载元素的,使用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就无比强大了

 */

class CI_Loader {

 protected $_ci_ob_level;

 protected $_ci_view_paths  = array();

 protected $_ci_library_paths = array();

 protected $_ci_model_paths  = array();

 protected $_ci_helper_paths  = array();

 protected $_base_classes  = array(); // Set by the controller class

 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' => 'agent');

 public function __construct()

 {       

                //获取缓冲嵌套级别

  $this->_ci_ob_level  = ob_get_level();

  //library路径

                $this->_ci_library_paths = array(APPPATH, BASEPATH);

                //helper路径

  $this->_ci_helper_paths = array(APPPATH, BASEPATH);

                //model路径

  $this->_ci_model_paths = array(APPPATH);

                //view路径

  $this->_ci_view_paths = array(APPPATH.'views/' => TRUE);

  log_message('debug', "Loader Class Initialized");

 }

 // --------------------------------------------------------------------

 /**

  * 初始化Loader

  *

  */

 public function 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();

  return $this;

 }

 // --------------------------------------------------------------------

 /**

  * 检测类是否加载

  */

 public function is_loaded($class)

 {

  if (isset($this->_ci_classes[$class]))

  {

   return $this->_ci_classes[$class];

  }

  return FALSE;

 }

 // --------------------------------------------------------------------

 /**

  * 加载Class

  */

 public function library($library = '', $params = NULL, $object_name = NULL)

 {

  if (is_array($library))

  {

   foreach ($library as $class)

   {

    $this->library($class, $params);

   }

   return;

  }

                //如果$library为空或者已经加载。。。

  if ($library == '' OR isset($this->_base_classes[$library]))

  {

   return FALSE;

  }

  if ( ! is_null($params) && ! is_array($params))

  {

   $params = NULL;

  }

  $this->_ci_load_class($library, $params, $object_name);

 }

 // --------------------------------------------------------------------

 /**

  * 加载和实例化model

  */

 public function model($model, $name = '', $db_conn = FALSE)

 {

                //CI支持数组加载多个model

  if (is_array($model))

  {

   foreach ($model as $babe)

   {

    $this->model($babe);

   }

   return;

  }

  if ($model == '')

  {

   return;

  }

  $path = '';

  // 是否存在子目录

  if (($last_slash = strrpos($model, '/')) !== FALSE)

  {

   // The path is in front of the last slash

   $path = substr($model, 0, $last_slash + 1);

   // And the model name behind it

   $model = substr($model, $last_slash + 1);

  }

  if ($name == '')

  {

   $name = $model;

  }

  if (in_array($name, $this->_ci_models, TRUE))

  {

   return;

  }

  $CI =& get_instance();

  if (isset($CI->$name))

  {

   show_error('The model name you are loading is the name of a resource that is already being used: '.$name);

  }

  $model = strtolower($model); //model文件名全小写

  foreach ($this->_ci_model_paths as $mod_path)

  {

   if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))

   {

    continue;

   }

   if ($db_conn !== FALSE AND ! class_exists('CI_DB'))

   {

    if ($db_conn === TRUE)

    {

     $db_conn = '';

    }

    $CI->load->database($db_conn, FALSE, TRUE);

   }

   if ( ! class_exists('CI_Model'))

   {

    load_class('Model', 'core');

   }

   require_once($mod_path.'models/'.$path.$model.'.php');

   $model = ucfirst($model);

   $CI->$name = new $model();

                        //保存在Loader::_ci_models中,以后可以用它来判断某个model是否已经加载过。

   $this->_ci_models[] = $name;

   return;

  }

  // couldn't find the model

  show_error('Unable to locate the model you have specified: '.$model);

 }

 // --------------------------------------------------------------------

 /**

  * 数据库Loader

  */

 public function database($params = '', $return = FALSE, $active_record = NULL)

 {

  // Grab the super object

  $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))

  {

   return FALSE;

  }

  require_once(BASEPATH.'database/DB.php');

  if ($return === TRUE)

  {

   return DB($params, $active_record);

  }

  // Initialize the db variable.  Needed to prevent

  // reference errors with some configurations

  $CI->db = '';

  // Load the DB class

  $CI->db =& DB($params, $active_record);

 }

 // --------------------------------------------------------------------

 /**

  * 加载数据库工具类

  */

 public function dbutil()

 {

  if ( ! class_exists('CI_DB'))

  {

   $this->database();

  }

  $CI =& get_instance();

  // for backwards compatibility, load dbforge so we can extend dbutils off it

  // this use is deprecated and strongly discouraged

  $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();

 }

 // --------------------------------------------------------------------

 /**

  * Load the Database Forge Class

  *

  * @return string

  */

 public function dbforge()

 {

  if ( ! class_exists('CI_DB'))

  {

   $this->database();

  }

  $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();

 }

 // --------------------------------------------------------------------

 /**

  * 加载视图文件

  */

 public function 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));

 }

 // --------------------------------------------------------------------

 /**

  * 加载普通文件

  */

 public function file($path, $return = FALSE)

 {

  return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));

 }

 // --------------------------------------------------------------------

 /**

  * 设置变量

  *

  * Once variables are set they become available within

  * the controller class and its "view" files.

  *

  */

 public function 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;

   }

  }

 }

 // --------------------------------------------------------------------

 /**

  * 检查并获取变量

  */

 public function get_var($key)

 {

  return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;

 }

 // --------------------------------------------------------------------

 /**

  * 加载helper

  */

 public function helper($helpers = array())

 {

  foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)

  {

   if (isset($this->_ci_helpers[$helper]))

   {

    continue;

   }

   $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php';

   // 如果是扩展helper的话

   if (file_exists($ext_helper))

   {

    $base_helper = BASEPATH.'helpers/'.$helper.'.php';

    if ( ! file_exists($base_helper))

    {

     show_error('Unable to load the requested file: helpers/'.$helper.'.php');

    }

    include_once($ext_helper);

    include_once($base_helper);

    $this->_ci_helpers[$helper] = TRUE;

    log_message('debug', 'Helper loaded: '.$helper);

    continue;

   }

   // 如果不是扩展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 loaded: '.$helper);

     break;

    }

   }

   // 如果该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;

 }

 // --------------------------------------------------------------------

 /**

  * 剔除Package Path

  *

  * Remove a path from the library, model, and helper path arrays if it exists

  * If no path is provided, the most recently added path is removed.

  *

  */

 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);

  }

  else

  {

   $path = rtrim($path, '/').'/';

   foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)

   {

    if (($key = array_search($path, $this->{$var})) !== FALSE)

    {

     unset($this->{$var}[$key]);

    }

   }

   if (isset($this->_ci_view_paths[$path.'views/']))

   {

    unset($this->_ci_view_paths[$path.'views/']);

   }

   if (($key = array_search($path, $config->_config_paths)) !== FALSE)

   {

    unset($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)));

 }

 // --------------------------------------------------------------------

 /**

  * Loader

  *

  * This function is used to load views and files.

  * Variables are prefixed with _ci_ to avoid symbol collision with

  * variables made available to view files

  *

  * @param array

  * @return void

  */

 protected function _ci_load($_ci_data)

 {

  // Set the default data variables

  foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)

  {

   $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];

  }

  $file_exists = FALSE;

                //如果$_ci_path不为空,则说明当前要加载普通文件。Loader::file才会有path

  if ($_ci_path != '')

  {

   $_ci_x = explode('/', $_ci_path);

   $_ci_file = end($_ci_x);

  }

  else

  {

   $_ci_ext = pathinfo($_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;

     break;

    }

    if ( ! $cascade)

    {

     break;

    }

   }

  }

                //view文件不存在则会报错

  if ( ! $file_exists && ! file_exists($_ci_path))

  {

   show_error('Unable to load the requested file: '.$_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;

   }

  }

  /*

   * Extract and cache variables

   *

   * You can either set variables using the dedicated $this->load_vars()

   * function or via the second parameter of this function. We'll merge

   * the two types and cache them so that views that are embedded within

   * other views can have access to these variables.

   */

  if (is_array($_ci_vars))

  {

   $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);

  }

  extract($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('<?=', '<?php echo ', file_get_contents($_ci_path))));

  }

  else

  {

   include($_ci_path); // include() vs include_once() allows for multiple views with the same name

  }

  log_message('debug', 'File loaded: '.$_ci_path);

  // 是否直接返回view数据

  if ($_ci_return === TRUE)

  {

   $buffer = ob_get_contents();

   @ob_end_clean();

   return $buffer;

  }

  //当前这个视图文件是被另一个视图文件通过$this->view()方法引入,即视图文件嵌入视图文件

  if (ob_get_level() > $this->_ci_ob_level + 1)

  {

   ob_end_flush();

  }

  else

  {       ////把缓冲区的内容交给Output组件并清空关闭缓冲区。

   $_ci_CI->output->append_output(ob_get_contents());

   @ob_end_clean();

  }

 }

 // --------------------------------------------------------------------

 /**

  * 加载类

  */

 protected function _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', "Unable to load the requested class: ".$class);

     show_error("Unable to load the requested class: ".$class);

    }

    // Safety:  Was the class already loaded by a previous call?

    if (in_array($subclass, $this->_ci_loaded_files))

    {

     // Before we deem this to be a duplicate request, let's see

     // if a custom object name is being supplied.  If so, we'll

     // return a new instance of the object

     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." class already loaded. Second attempt ignored.");

     return;

    }

    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';

    // Does the file exist?  No?  Bummer...

    if ( ! file_exists($filepath))

    {

     continue;

    }

    // Safety:  Was the class already loaded by a previous call?

    if (in_array($filepath, $this->_ci_loaded_files))

    {

     // Before we deem this to be a duplicate request, let's see

     // if a custom object name is being supplied.  If so, we'll

     // return a new instance of the object

     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." class already loaded. Second attempt ignored.");

     return;

    }

    include_once($filepath);

    $this->_ci_loaded_files[] = $filepath;

    return $this->_ci_init_class($class, '', $params, $object_name);

   }

  } // END FOREACH

  // 如果还没有找到该class,最后的尝试是该class会不会在同名的子目录下

  if ($subdir == '')

  {

   $path = strtolower($class).'/'.$class;

   return $this->_ci_load_class($path, $params);

  }

  // 加载失败,报错

  if ($is_duplicate == FALSE)

  {

   log_message('error', "Unable to load the requested class: ".$class);

   show_error("Unable to load the requested class: ".$class);

  }

 }

 // --------------------------------------------------------------------

 /**

  * 实例化已经加载的类

  */

 protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)

 {

  // 是否有类的配置信息

  if ($config === NULL)

  {

   // Fetch the config paths containing any package paths

   $config_component = $this->_ci_get_component('config');

   if (is_array($config_component->_config_paths))

   {

    // Break on the first found file, thus package files

    // are not overridden by default paths

    foreach ($config_component->_config_paths as $path)

    {

     // We test for both uppercase and lowercase, for servers that

     // are case-sensitive with regard to file names. Check for environment

     // first, global next

     if (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))

     {

      include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');

      break;

     }

     elseif (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))

     {

      include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');

      break;

     }

     elseif (file_exists($path .'config/'.strtolower($class).'.php'))

     {

      include($path .'config/'.strtolower($class).'.php');

      break;

     }

     elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php'))

     {

      include($path .'config/'.ucfirst(strtolower($class)).'.php');

      break;

     }

    }

   }

  }

  if ($prefix == '')

  {       //system下library

   if (class_exists('CI_'.$class))

   {

    $name = 'CI_'.$class;

   }

   elseif (class_exists(config_item('subclass_prefix').$class))

   {       //扩展library

    $name = config_item('subclass_prefix').$class;

   }

   else

   {

    $name = $class;

   }

  }

  else

  {

   $name = $prefix.$class;

  }

  // Is the class name valid?

  if ( ! class_exists($name))

  {

   log_message('error', "Non-existent class: ".$name);

   show_error("Non-existent class: ".$class);

  }

  // Set the variable name we will assign the class to

  // Was a custom class name supplied?  If so we'll use it

  $class = strtolower($class);

  if (is_null($object_name))

  {

   $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];

  }

  else

  {

   $classvar = $object_name;

  }

  // Save the class name and object name

  $this->_ci_classes[$class] = $classvar;

  // 将初始化的类的实例给CI超级句柄

  $CI =& get_instance();

  if ($config !== NULL)

  {

   $CI->$classvar = new $name($config);

  }

  else

  {

   $CI->$classvar = new $name;

  }

 }

 // --------------------------------------------------------------------

 /**

  * 自动加载器

         * 

         * autoload.php配置的自动加载文件有:

         *  | 1. Packages

            | 2. Libraries

            | 3. Helper files

            | 4. Custom config files

            | 5. Language files

            | 6. Models

  */

 private function _ci_autoloader()

 {

  if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))

  {

   include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');

  }

  else

  {

   include(APPPATH.'config/autoload.php');

  }

  if ( ! isset($autoload))

  {

   return FALSE;

  }

  // 自动加载packages,也就是将package_path加入到library,model,helper,config

  if (isset($autoload['packages']))

  {

   foreach ($autoload['packages'] as $package_path)

   {

    $this->add_package_path($package_path);

   }

  }

  // 加载config文件

  if (count($autoload['config']) > 0)

  {

   $CI =& get_instance();

   foreach ($autoload['config'] as $key => $val)

   {

    $CI->config->load($val);

   }

  }

  // 加载helper和language

  foreach (array('helper', 'language') 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'];

  }

  // 加载libraries

  if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)

  {

   // 加载db

   if (in_array('database', $autoload['libraries']))

   {

    $this->database();

    $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));

   }

   // 加载所有其他libraries

   foreach ($autoload['libraries'] as $item)

   {

    $this->library($item);

   }

  }

  // Autoload models

  if (isset($autoload['model']))

  {

   $this->model($autoload['model']);

  }

 }

 // --------------------------------------------------------------------

 /**

  * 返回由对象属性组成的关联数组

  */

 protected function _ci_object_to_array($object)

 {

  return (is_object($object)) ? get_object_vars($object) : $object;

 }

 // --------------------------------------------------------------------

 /**

  * 获取CI某个组件的实例

  */

 protected function &_ci_get_component($component)

 {

  $CI =& get_instance();

  return $CI->$component;

 }

 // --------------------------------------------------------------------

 /**

  * 处理文件名,这个函数主要是返回正确文件名

  */

 protected function _ci_prep_filename($filename, $extension)

 {

  if ( ! is_array($filename))

  {

   return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension));

  }

  else

  {

   foreach ($filename as $key => $val)

   {

    $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension);

   }

   return $filename;

  }

 }

}
PHP 相关文章推荐
php iconv() : Detected an illegal character in input string
Dec 05 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
详解php的socket通信
Aug 11 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 PHP
WordPress伪静态规则设置代码实例
Dec 10 PHP
php+ajax实现无刷新分页的方法
Nov 04 #PHP
CI框架安全类Security.php源码分析
Nov 04 #PHP
CI框架Session.php源码分析
Nov 03 #PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 #PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 #PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
Nov 03 #PHP
PHP防止注入攻击实例分析
Nov 03 #PHP
You might like
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
前端必学之PHP语法基础
2016/01/01 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
django删除表重建的实现方法
2019/08/28 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
影视艺术学院毕业生自荐信
2013/11/13 职场文书
小班上学期评语
2014/05/05 职场文书
财务务虚会发言材料
2014/10/20 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python