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 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
CodeIgniter常用知识点小结
May 26 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
PHP精确计算功能示例
Nov 29 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
Apr 27 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
php DES加密算法实例分析
Sep 18 PHP
如何在PHP中生成随机数
Jun 04 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
咖啡与水的关系
2021/03/03 冲泡冲煮
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python如何实现int函数的方法示例
2018/02/19 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
会计自我鉴定
2013/11/02 职场文书
企业申诉管理制度
2014/01/30 职场文书
文明市民先进事迹
2014/05/15 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
保姆聘用合同
2015/09/21 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python