CI框架 -- 核心文件 之 Loader.php(加载器)
加载类库文件:$this->load->library()
1 /**2 * Loader Class3 *4 * 用户加载views和files,常见的函数有model(),view(),library(),helper()5 *6 * Controller的好助手,$this->load =& load_class('Loader', 'core');,加载了loader,Controller就无比强大了7 * @link http://www.phpddt.com8 */ 9 classCI_Loader {10 11 protected $_ci_ob_level;12 13 protected $_ci_view_paths = array();14 protected $_ci_library_paths = array();15 protected $_ci_model_paths = array();16 protected $_ci_helper_paths = array();17 18 protected $_base_classes = array(); //Set by the controller class 19 20 protected $_ci_cached_vars = array();21 22 protected $_ci_classes = array();23 24 protected $_ci_loaded_files = array();25 26 protected $_ci_models = array();27 28 protected $_ci_helpers = array();29 30 protected $_ci_varmap = array('unit_test' => 'unit', 31 'user_agent' => 'agent');32 33 public function__construct()34 {35 //获取缓冲嵌套级别 36 $this->_ci_ob_level = ob_get_level();37 //library路径 38 $this->_ci_library_paths = array(APPPATH,BASEPATH);39 //helper路径 40 $this->_ci_helper_paths = array(APPPATH,BASEPATH);41 //model路径 42 $this->_ci_model_paths = array(APPPATH);43 //view路径 44 $this->_ci_view_paths = array(APPPATH.'views/' => TRUE);45 46 log_message('debug', "Loader Class Initialized");47 }48 49 //-------------------------------------------------------------------- 50 51 /**52 * 初始化Loader53 *54 */ 55 public functioninitialize()56 {57 $this->_ci_classes = array();58 $this->_ci_loaded_files = array();59 $this->_ci_models = array();60 //将is_loaded(common中记录加载核心类函数)加载的核心类交给_base_classes 61 $this->_base_classes =&is_loaded();62 63 //加载autoload.php配置中文件 64 $this->_ci_autoloader();65 66 return $this;67 }68 69 //-------------------------------------------------------------------- 70 71 /**72 * 检测类是否加载73 */ 74 public function is_loaded($class)75 {76 if (isset($this->_ci_classes[$class]))77 {78 return $this->_ci_classes[$class];79 }80 81 return FALSE;82 }83 84 //-------------------------------------------------------------------- 85 86 /**87 * 加载Class88 */ 89 public function library($library = '', $params = NULL, $object_name = NULL)90 {91 if (is_array($library))92 {93 foreach ($library as $class)94 {95 $this->library($class, $params);96 }97 98 return;99 }100 101 //如果$library为空或者已经加载。。。 102 if ($library == '' OR isset($this->_base_classes[$library]))103 {104 return FALSE;105 }106 107 if ( ! is_null($params) && ! is_array($params))108 {109 $params = NULL;110 }111 112 $this->_ci_load_class($library, $params, $object_name);113 }114 115 //-------------------------------------------------------------------- 116 117 /**118 * 加载和实例化model119 */ 120 public function model($model, $name = '', $db_conn = FALSE)121 {122 //CI支持数组加载多个model 123 if (is_array($model))124 {125 foreach ($model as $babe)126 {127 $this->model($babe);128 }129 return;130 }131 132 if ($model == '')133 {134 return;135 }136 137 $path = '';138 139 //是否存在子目录 140 if (($last_slash = strrpos($model, '/')) !== FALSE)141 {142 //The path is in front of the last slash 143 $path = substr($model, 0, $last_slash + 1);144 145 //And the model name behind it 146 $model = substr($model, $last_slash + 1);147 }148 149 if ($name == '')150 {151 $name = $model;152 }153 154 if (in_array($name, $this->_ci_models, TRUE))155 {156 return;157 }158 159 $CI =&get_instance();160 if (isset($CI->$name))161 {162 show_error('The model name you are loading is the name of a resource that is already being used: '.$name);163 }164 165 $model = strtolower($model); //model文件名全小写 166 167 foreach ($this->_ci_model_paths as $mod_path)168 {169 if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))170 {171 continue;172 }173 174 if ($db_conn !== FALSE AND ! class_exists('CI_DB'))175 {176 if ($db_conn === TRUE)177 {178 $db_conn = '';179 }180 181 $CI->load->database($db_conn, FALSE, TRUE);182 }183 184 if ( ! class_exists('CI_Model'))185 {186 load_class('Model', 'core');187 }188 189 require_once($mod_path.'models/'.$path.$model.'.php');190 191 $model = ucfirst($model);192 193 $CI->$name = new $model();194 //保存在Loader::_ci_models中,以后可以用它来判断某个model是否已经加载过。 195 $this->_ci_models[] = $name;196 return;197 }198 199 //couldn't find the model 200 show_error('Unable to locate the model you have specified: '.$model);201 }202 203 //-------------------------------------------------------------------- 204 205 /**206 * 数据库Loader207 */ 208 public function database($params = '', $return = FALSE, $active_record = NULL)209 {210 //Grab the super object 211 $CI =&get_instance();212 213 //是否需要加载db 214 if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db))215 {216 return FALSE;217 }218 219 require_once(BASEPATH.'database/DB.php');220 221 if ($return === TRUE)222 {223 return DB($params, $active_record);224 }225 226 //Initialize the db variable. Needed to prevent227 // reference errors with some configurations 228 $CI->db = '';229 230 //Load the DB class 231 $CI->db =& DB($params, $active_record);232 }233 234 //-------------------------------------------------------------------- 235 236 /**237 * 加载数据库工具类238 */ 239 public functiondbutil()240 {241 if ( ! class_exists('CI_DB'))242 {243 $this->database();244 }245 246 $CI =&get_instance();247 248 //for backwards compatibility, load dbforge so we can extend dbutils off it249 // this use is deprecated and strongly discouraged 250 $CI->load->dbforge();251 252 require_once(BASEPATH.'database/DB_utility.php');253 require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility.php');254 $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';255 256 $CI->dbutil = new $class();257 }258 259 //-------------------------------------------------------------------- 260 261 /**262 * Load the Database Forge Class263 *264 * @return string265 */ 266 public functiondbforge()267 {268 if ( ! class_exists('CI_DB'))269 {270 $this->database();271 }272 273 $CI =&get_instance();274 275 require_once(BASEPATH.'database/DB_forge.php');276 require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php');277 $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';278 279 $CI->dbforge = new $class();280 }281 282 //-------------------------------------------------------------------- 283 284 /**285 * 加载视图文件286 */ 287 public function view($view, $vars = array(), $return = FALSE)288 {289 return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));290 }291 292 //-------------------------------------------------------------------- 293 294 /**295 * 加载普通文件296 */ 297 public function file($path, $return = FALSE)298 {299 return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));300 }301 302 //-------------------------------------------------------------------- 303 304 /**305 * 设置变量306 *307 * Once variables are set they become available within308 * the controller class and its "view" files.309 *310 */ 311 public function vars($vars = array(), $val = '')312 {313 if ($val != '' AND is_string($vars))314 {315 $vars = array($vars => $val);316 }317 318 $vars = $this->_ci_object_to_array($vars);319 320 if (is_array($vars) AND count($vars) > 0)321 {322 foreach ($vars as $key => $val)323 {324 $this->_ci_cached_vars[$key] = $val;325 }326 }327 }328 329 //-------------------------------------------------------------------- 330 331 /**332 * 检查并获取变量333 */ 334 public function get_var($key)335 {336 return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;337 }338 339 //-------------------------------------------------------------------- 340 341 /**342 * 加载helper343 */ 344 public function helper($helpers = array())345 {346 foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)347 {348 if (isset($this->_ci_helpers[$helper]))349 {350 continue;351 }352 353 $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php';354 355 //如果是扩展helper的话 356 if (file_exists($ext_helper))357 {358 $base_helper = BASEPATH.'helpers/'.$helper.'.php';359 360 if ( ! file_exists($base_helper))361 {362 show_error('Unable to load the requested file: helpers/'.$helper.'.php');363 }364 365 include_once($ext_helper);366 include_once($base_helper);367 368 $this->_ci_helpers[$helper] = TRUE;369 log_message('debug', 'Helper loaded: '.$helper);370 continue;371 }372 373 //如果不是扩展helper,helper路径中加载helper 374 foreach ($this->_ci_helper_paths as $path)375 {376 if (file_exists($path.'helpers/'.$helper.'.php'))377 {378 include_once($path.'helpers/'.$helper.'.php');379 380 $this->_ci_helpers[$helper] = TRUE;381 log_message('debug', 'Helper loaded: '.$helper);382 break;383 }384 }385 386 //如果该helper还没加载成功的话,说明加载helper失败 387 if ( ! isset($this->_ci_helpers[$helper]))388 {389 show_error('Unable to load the requested file: helpers/'.$helper.'.php');390 }391 }392 }393 394 //-------------------------------------------------------------------- 395 396 /**397 * 可以看到helpers调用也是上面的helper,只是helpers的别名而已398 */ 399 public function helpers($helpers = array())400 {401 $this->helper($helpers);402 }403 404 //-------------------------------------------------------------------- 405 406 /**407 * 加载language文件408 */ 409 public function language($file = array(), $lang = '')410 {411 $CI =&get_instance();412 413 if ( ! is_array($file))414 {415 $file = array($file);416 }417 418 foreach ($file as $langfile)419 {420 $CI->lang->load($langfile, $lang);421 }422 }423 424 //-------------------------------------------------------------------- 425 426 /**427 * 加载配置文件428 */ 429 public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)430 {431 $CI =&get_instance();432 $CI->config->load($file, $use_sections, $fail_gracefully);433 }434 435 //-------------------------------------------------------------------- 436 437 /**438 * Driver439 *440 * 加载 driver library441 */ 442 public function driver($library = '', $params = NULL, $object_name = NULL)443 {444 if ( ! class_exists('CI_Driver_Library'))445 {446 //we aren't instantiating an object here, that'll be done by the Library itself 447 require BASEPATH.'libraries/Driver.php';448 }449 450 if ($library == '')451 {452 return FALSE;453 }454 455 //We can save the loader some time since Drivers will *always* be in a subfolder,456 // and typically identically named to the library 457 if ( ! strpos($library, '/'))458 {459 $library = ucfirst($library).'/'.$library;460 }461 462 return $this->library($library, $params, $object_name);463 }464 465 //-------------------------------------------------------------------- 466 467 /**468 * 添加 Package 路径469 *470 * 把package路径添加到库,模型,助手,配置路径471 */ 472 public function add_package_path($path, $view_cascade=TRUE)473 {474 $path = rtrim($path, '/').'/';475 476 array_unshift($this->_ci_library_paths, $path);477 array_unshift($this->_ci_model_paths, $path);478 array_unshift($this->_ci_helper_paths, $path);479 480 $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;481 482 $config =& $this->_ci_get_component('config');483 array_unshift($config->_config_paths, $path);484 }485 486 //-------------------------------------------------------------------- 487 488 /**489 * 获取Package Paths,默认不包含BASEPATH490 */ 491 public function get_package_paths($include_base = FALSE)492 {493 return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths;494 }495 496 //-------------------------------------------------------------------- 497 498 /**499 * 剔除Package Path500 *501 * Remove a path from the library, model, and helper path arrays if it exists502 * If no path is provided, the most recently added path is removed.503 *504 */ 505 public function remove_package_path($path = '', $remove_config_path = TRUE)506 {507 $config =& $this->_ci_get_component('config');508 509 if ($path == '')510 {511 $void = array_shift($this->_ci_library_paths);512 $void = array_shift($this->_ci_model_paths);513 $void = array_shift($this->_ci_helper_paths);514 $void = array_shift($this->_ci_view_paths);515 $void = array_shift($config->_config_paths);516 }517 else 518 {519 $path = rtrim($path, '/').'/';520 foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)521 {522 if (($key = array_search($path, $this->{$var})) !== FALSE)523 {524 unset($this->{$var}[$key]);525 }526 }527 528 if (isset($this->_ci_view_paths[$path.'views/']))529 {530 unset($this->_ci_view_paths[$path.'views/']);531 }532 533 if (($key = array_search($path, $config->_config_paths)) !== FALSE)534 {535 unset($config->_config_paths[$key]);536 }537 }538 539 //保证应用默认的路径依然存在 540 $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH,BASEPATH)));541 $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH,BASEPATH)));542 $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));543 $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));544 $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));545 }546 547 //-------------------------------------------------------------------- 548 549 /**550 * Loader551 *552 * This function is used to load views and files.553 * Variables are prefixed with _ci_ to avoid symbol collision with554 * variables made available to view files555 *556 * @param array557 * @return void558 */ 559 protected function _ci_load($_ci_data)560 {561 //Set the default data variables 562 foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)563 {564 $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];565 }566 567 $file_exists = FALSE;568 //如果$_ci_path不为空,则说明当前要加载普通文件。Loader::file才会有path 569 if ($_ci_path != '')570 {571 $_ci_x = explode('/', $_ci_path);572 $_ci_file = end($_ci_x);573 }574 else 575 {576 $_ci_ext = pathinfo($_ci_view,PATHINFO_EXTENSION);577 $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;578 579 foreach ($this->_ci_view_paths as $view_file => $cascade)580 {581 if (file_exists($view_file.$_ci_file))582 {583 $_ci_path = $view_file.$_ci_file;584 $file_exists = TRUE;585 break;586 }587 588 if ( ! $cascade)589 {590 break;591 }592 }593 }594 //view文件不存在则会报错 595 if ( ! $file_exists && ! file_exists($_ci_path))596 {597 show_error('Unable to load the requested file: '.$_ci_file);598 }599 600 //把CI的所有属性都传递给loader,view中$this指的是loader 601 $_ci_CI =&get_instance();602 foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)603 {604 if ( ! isset($this->$_ci_key))605 {606 $this->$_ci_key =& $_ci_CI->$_ci_key;607 }608 }609 610 /* 611 * Extract and cache variables612 *613 * You can either set variables using the dedicated $this->load_vars()614 * function or via the second parameter of this function. We'll merge615 * the two types and cache them so that views that are embedded within616 * other views can have access to these variables.617 */ 618 619 620 if (is_array($_ci_vars))621 {622 $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);623 }624 625 extract($this->_ci_cached_vars);626 627 /* 628 * 将视图内容放到缓存区629 *630 */ 631 ob_start();632 633 //支持短标签 634 if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)635 {636 echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));637 }638 else 639 {640 include($_ci_path); //include() vs include_once() allows for multiple views with the same name 641 }642 643 log_message('debug', 'File loaded: '.$_ci_path);644 645 //是否直接返回view数据 646 if ($_ci_return === TRUE)647 {648 $buffer = ob_get_contents();649 @ob_end_clean();650 return $buffer;651 }652 653 //当前这个视图文件是被另一个视图文件通过$this->view()方法引入,即视图文件嵌入视图文件 654 if (ob_get_level() > $this->_ci_ob_level + 1)655 {656 657 ob_end_flush();658 }659 else 660 { ////把缓冲区的内容交给Output组件并清空关闭缓冲区。 661 $_ci_CI->output->append_output(ob_get_contents());662 @ob_end_clean();663 }664 }665 666 //-------------------------------------------------------------------- 667 668 /**669 * 加载类670 */ 671 protected function _ci_load_class($class, $params = NULL, $object_name = NULL)672 {673 //去掉.php和两端的/获取的$class就是类名或目录名+类名 674 $class = str_replace('.php', '', trim($class, '/'));675 676 //CI允许dir/filename方式 677 $subdir = '';678 if (($last_slash = strrpos($class, '/')) !== FALSE)679 {680 //目录 681 $subdir = substr($class, 0, $last_slash + 1);682 683 //文件名 684 $class = substr($class, $last_slash + 1);685 }686 687 //允许加载的类名首字母大写或全小写 688 foreach (array(ucfirst($class), strtolower($class)) as $class)689 {690 $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';691 692 //是否是扩展类 693 if (file_exists($subclass))694 {695 $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php';696 697 if ( ! file_exists($baseclass))698 {699 log_message('error', "Unable to load the requested class: ".$class);700 show_error("Unable to load the requested class: ".$class);701 }702 703 //Safety: Was the class already loaded by a previous call? 704 if (in_array($subclass, $this->_ci_loaded_files))705 {706 //Before we deem this to be a duplicate request, let's see707 // if a custom object name is being supplied. If so, we'll708 // return a new instance of the object 709 if ( ! is_null($object_name))710 {711 $CI =&get_instance();712 if ( ! isset($CI->$object_name))713 {714 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);715 }716 }717 718 $is_duplicate = TRUE;719 log_message('debug', $class." class already loaded. Second attempt ignored.");720 return;721 }722 723 include_once($baseclass);724 include_once($subclass);725 $this->_ci_loaded_files[] = $subclass;726 //实例化类 727 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);728 }729 730 //如果不是扩展,和上面类似 731 $is_duplicate = FALSE;732 foreach ($this->_ci_library_paths as $path)733 {734 $filepath = $path.'libraries/'.$subdir.$class.'.php';735 736 //Does the file exist? No? Bummer... 737 if ( ! file_exists($filepath))738 {739 continue;740 }741 742 //Safety: Was the class already loaded by a previous call? 743 if (in_array($filepath, $this->_ci_loaded_files))744 {745 //Before we deem this to be a duplicate request, let's see746 // if a custom object name is being supplied. If so, we'll747 // return a new instance of the object 748 if ( ! is_null($object_name))749 {750 $CI =&get_instance();751 if ( ! isset($CI->$object_name))752 {753 return $this->_ci_init_class($class, '', $params, $object_name);754 }755 }756 757 $is_duplicate = TRUE;758 log_message('debug', $class." class already loaded. Second attempt ignored.");759 return;760 }761 762 include_once($filepath);763 $this->_ci_loaded_files[] = $filepath;764 return $this->_ci_init_class($class, '', $params, $object_name);765 }766 767 } //END FOREACH768 769 // 如果还没有找到该class,最后的尝试是该class会不会在同名的子目录下 770 if ($subdir == '')771 {772 $path = strtolower($class).'/'.$class;773 return $this->_ci_load_class($path, $params);774 }775 776 //加载失败,报错 777 if ($is_duplicate == FALSE)778 {779 log_message('error', "Unable to load the requested class: ".$class);780 show_error("Unable to load the requested class: ".$class);781 }782 }783 784 //-------------------------------------------------------------------- 785 786 /**787 * 实例化已经加载的类788 */ 789 protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)790 {791 //是否有类的配置信息 792 if ($config === NULL)793 {794 //Fetch the config paths containing any package paths 795 $config_component = $this->_ci_get_component('config');796 797 if (is_array($config_component->_config_paths))798 {799 //Break on the first found file, thus package files800 // are not overridden by default paths 801 foreach ($config_component->_config_paths as $path)802 {803 //We test for both uppercase and lowercase, for servers that804 // are case-sensitive with regard to file names. Check for environment805 // first, global next 806 if (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))807 {808 include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');809 break;810 }811 elseif (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))812 {813 include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');814 break;815 }816 elseif (file_exists($path .'config/'.strtolower($class).'.php'))817 {818 include($path .'config/'.strtolower($class).'.php');819 break;820 }821 elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php'))822 {823 include($path .'config/'.ucfirst(strtolower($class)).'.php');824 break;825 }826 }827 }828 }829 830 if ($prefix == '')831 { //system下library 832 if (class_exists('CI_'.$class))833 {834 $name = 'CI_'.$class;835 }836 elseif (class_exists(config_item('subclass_prefix').$class))837 { //扩展library 838 $name = config_item('subclass_prefix').$class;839 }840 else 841 {842 $name = $class;843 }844 }845 else 846 {847 $name = $prefix.$class;848 }849 850 //Is the class name valid? 851 if ( ! class_exists($name))852 {853 log_message('error', "Non-existent class: ".$name);854 show_error("Non-existent class: ".$class);855 }856 857 //Set the variable name we will assign the class to858 // Was a custom class name supplied? If so we'll use it 859 $class = strtolower($class);860 861 if (is_null($object_name))862 {863 $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];864 }865 else 866 {867 $classvar = $object_name;868 }869 870 //Save the class name and object name 871 $this->_ci_classes[$class] = $classvar;872 873 //将初始化的类的实例给CI超级句柄 874 $CI =&get_instance();875 if ($config !== NULL)876 {877 $CI->$classvar = new $name($config);878 }879 else 880 {881 $CI->$classvar = new $name;882 }883 }884 885 //-------------------------------------------------------------------- 886 887 /**888 * 自动加载器889 *890 * autoload.php配置的自动加载文件有:891 * | 1. Packages892 | 2. Libraries893 | 3. Helper files894 | 4. Custom config files895 | 5. Language files896 | 6. Models897 */ 898 private function_ci_autoloader()899 {900 if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))901 {902 include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');903 }904 else 905 {906 include(APPPATH.'config/autoload.php');907 }908 909 if ( ! isset($autoload))910 {911 return FALSE;912 }913 914 //自动加载packages,也就是将package_path加入到library,model,helper,config 915 if (isset($autoload['packages']))916 {917 foreach ($autoload['packages'] as $package_path)918 {919 $this->add_package_path($package_path);920 }921 }922 923 //加载config文件 924 if (count($autoload['config']) > 0)925 {926 $CI =&get_instance();927 foreach ($autoload['config'] as $key => $val)928 {929 $CI->config->load($val);930 }931 }932 933 //加载helper和language 934 foreach (array('helper', 'language') as $type)935 {936 if (isset($autoload[$type]) AND count($autoload[$type]) > 0)937 {938 $this->$type($autoload[$type]);939 }940 }941 942 //这个好像是为了兼容以前版本的 943 if ( ! isset($autoload['libraries']) AND isset($autoload['core']))944 {945 $autoload['libraries'] = $autoload['core'];946 }947 948 //加载libraries 949 if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)950 {951 //加载db 952 if (in_array('database', $autoload['libraries']))953 {954 $this->database();955 $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));956 }957 958 //加载所有其他libraries 959 foreach ($autoload['libraries'] as $item)960 {961 $this->library($item);962 }963 }964 965 //Autoload models 966 if (isset($autoload['model']))967 {968 $this->model($autoload['model']);969 }970 }971 972 //-------------------------------------------------------------------- 973 974 /**975 * 返回由对象属性组成的关联数组976 */ 977 protected function _ci_object_to_array($object)978 {979 return (is_object($object)) ? get_object_vars($object) : $object;980 }981 982 //-------------------------------------------------------------------- 983 984 /**985 * 获取CI某个组件的实例986 */ 987 protected function &_ci_get_component($component)988 {989 $CI =&get_instance();990 return $CI->$component;991 }992 993 //-------------------------------------------------------------------- 994 995 /**996 * 处理文件名,这个函数主要是返回正确文件名997 */ 998 protected function _ci_prep_filename($filename, $extension)999 {1000 if ( ! is_array($filename))1001 {1002 return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension));1003 }1004 else 1005 {1006 foreach ($filename as $key => $val)1007 {1008 $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension);1009 }1010 1011 return $filename;1012 }1013 }1014 }
View Code
转载于:https://www.cnblogs.com/hf8051/p/5160426.html
CI框架 -- 核心文件 之 Loader.php(加载器)相关推荐
- AS3.0中的显示编程(五)-- Loader(加载器)
Loader类是一个显示容器,可用来加载SWF文件或图像(JPG.GIF.PNG),被加载的显示对象将做为Loader对象的子级添加.使用Loader类时,不可避免的要注意安全模型.但这块内容我会集中 ...
- Android Loader(加载器)详解
Loader(加载器)简介 Android 3.0 中引入了加载器,支持轻松在 Activity 或Fragment中异步加载数据. 加载器具有以下特征: (1)可用于每个 Activity 和 Fr ...
- Android 之Loader(加载器)
介绍 Android 3.0 中引入了加载器,支持轻松在 Activity 或片段中异步加载数据. 加载器具有以下特征: 可用于每个 Activity 和 Fragment. 支持异步加载数据. 监控 ...
- php ci hooks,CI框架 -- 核心文件 之 Hooks.php
1 /**2 * 钩子嘛,就是在不修改系统核心文件的基础上来改变或增加系统的核心运行功能3 */ 4 classCI_Hooks {5 6 /**7 * 检测hook是否开启8 */ 9 var $e ...
- Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)
Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...
- webpack-loader(加载器)
加载器是用于资源文件的转换. 加载器就是以资源文件作为入参并返回新的资源的函数(在Node.js中运行). 例子 例如,您可以使用加载器告诉webpack加载CSS文件或TypeScript文件,并将 ...
- contiki学习笔记(六)contiki程序加载器和多线程库
六.contiki程序加载器 contiki程序加载器是一个用于加载和启动程序的抽象接口. Data Structures struct dsc//DSC程序描述结构. ModulesThe Cont ...
- thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了
想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...
- 手写简版spring --5--资源加载器解析文件注册对象
一.目标 在完成 Spring 的框架雏形后,现在我们可以通过单元测试进行手动操作Bean对象的定义.注册和属性填充,以及最终获取对象调用方法.但这里会有一个问题,就是如果实际使用这个 Spring ...
- webpack中loader加载器(打包非js模块)
通过loader打包非js模块 我这儿用VScode为编辑器 在实际开发过程中,webpack默认只能打包处理以.js后缀名结尾的模块,其他非. js后缀名结 尾的模块,webpack 默认处理不了, ...
最新文章
- ASP.NET 实现站内信功能(点对点发送,管理员群发)
- Linux mount挂载umount卸载
- android finish()传参数,48. (android开发) activity间传递数据(打开浏览器、拨号盘、传参)...
- JMeter打开jmx文件出错CannotResolveClassException: org.apache.jmeter.protocol.ssh.sampler.SSHCommandSampler
- NLP技术中的Tokenization
- php 结果集 json,在PHP中提取JSONP结果集
- Edge 浏览器被爆存在 XSS 绕过漏洞
- NIO客户端主要创建过程
- kibana-7.15.2 中文简体
- 全国重点城市建筑物矢量数据合集二(Shp格式+带高度)
- docker的安装教程以及常用命令(一)
- 什么是Java(什么?Java?)
- 台式关掉计算机不断网,笔记本电脑在关掉屏幕后不断网设置方法
- 深入浅出 Docker
- html箭头随着点击而移动,点击左右箭头,图片跟随移动,正中的图片始终最大...
- 如何免费制作小程序?
- 深圳软件测试培训:Pytest+Appium+Allure 做 UI 自动化的那些事
- ZUCC_Object Oriented Programming_Lab06 Objects and Classes
- 计算机英语wheel是什么意思,wheel是什么意思_wheel翻译_读音_用法_翻译
- 读书笔记 - 我读《财务自由之路》 - 博多 舍费尔 / 你真正想要的是什么