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实现的MySQL数据浏览器
Mar 11 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
php遍历树的常用方法汇总
Jun 18 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
php判断IP地址是否在多个IP段内
Aug 18 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
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
什么是TCP/IP
2014/07/27 面试题
社区护士演讲稿
2014/08/27 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
工作简历自我评价
2015/03/11 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
四年级语文教学反思
2016/03/03 职场文书