首页 > PHP资讯 > PHP培训技术 > CI框架源码完全分析之核心文件Codeigniter.php

CI框架源码完全分析之核心文件Codeigniter.php

PHP培训技术

Codeigniter.php中加载了很多外部文件的,完成了CI的一次完整流程!
 

 $assign_to_config['subclass_prefix']));	}/* *php 程序运行默认是30s,这里用set_time_limt延长了,关于set_time_Limit() http://www.phpddt.com/php/set_time_limit.html * 扩展阅读,关于safe_mode:http://www.phpddt.com/php/643.html  ,你会完全明白的 */	if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)	{		@set_time_limit(300);	}/* * 加载Benchmark,它很简单,就是计算任意两点之间程序的运行时间 */	$BM =& load_class('Benchmark', 'core');	$BM->mark('total_execution_time_start');	$BM->mark('loading_time:_base_classes_start');        //加载钩子,后期会分析到,这玩意特好,扩展它能改变CI的运行流程	$EXT =& load_class('Hooks', 'core');        //这里就是一个钩子啦,其实就是该钩子程序在这里执行	$EXT->_call_hook('pre_system');        //加载配置文件,这里面都是一些加载或获取配置信息的函数	$CFG =& load_class('Config', 'core');	// 如果在index.php中也有配置$assign_to_config,则也把它加入到$CFG	if (isset($assign_to_config))	{		$CFG->_assign_to_config($assign_to_config);	}        //加载utf8组件、URI组件、Router组件	$UNI =& load_class('Utf8', 'core');	$URI =& load_class('URI', 'core');	$RTR =& load_class('Router', 'core');	$RTR->_set_routing();	//如果在index.php中定义了$routing,那么就会覆盖上面路由	if (isset($routing))	{		$RTR->_set_overrides($routing);	}        //加载output输出组件,不然你怎么用$this->Load->view()啊	$OUT =& load_class('Output', 'core');        //又见钩子,这里你可以自己写钩子程序替代Output类的缓存输出	if ($EXT->_call_hook('cache_override') === FALSE)	{		if ($OUT->_display_cache($CFG, $URI) == TRUE)		{			exit;		}	}        //安全组件啦,防xss攻击啊,csrf攻击啊        //关于xss攻击:http://www.phpddt.com/php/php-prevent-xss.html        //关于csrf:攻击:http://www.phpddt.com/reprint/csrf.html	$SEC =& load_class('Security', 'core');        //加载输入组件,就是你常用的$this->input->post();等	$IN	=& load_class('Input', 'core');        //加载语言组件啦	$LANG =& load_class('Lang', 'core');        //引入CI的控制器父类	require BASEPATH.'core/Controller.php';	function &get_instance()	{		return CI_Controller::get_instance();	}        //当然你扩展了CI_Controller控制器的话,也要引入啦	if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))	{		require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';	}	//加载你自己应用中的控制器Controller,如果没有当然error啦	if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))	{		show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');	}	include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');	// 好的基础的类都加载完毕了,咱可以mark一下	$BM->mark('loading_time:_base_classes_end');        //路由获取了控制器名和方法名,比如说默认welcome/index	$class  = $RTR->fetch_class();	$method = $RTR->fetch_method();        //这里CI规定一般非公共的方法以_开头,下面是判断,如果URI不可访问就show_404()	if ( ! class_exists($class)		OR strncmp($method, '_', 1) == 0		OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller')))		)	{		if ( ! empty($RTR->routes['404_override']))		{			$x = explode('/', $RTR->routes['404_override']);			$class = $x[0];			$method = (isset($x[1]) ? $x[1] : 'index');			if ( ! class_exists($class))			{				if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))				{					show_404("{$class}/{$method}");				}				include_once(APPPATH.'controllers/'.$class.'.php');			}		}		else		{			show_404("{$class}/{$method}");		}	}        //又是钩子,该钩子发生在控制器实例化之前的	$EXT->_call_hook('pre_controller');        //又mark一个点	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');        //终于实例化控制器了	$CI = new $class();        //钩子,不想多说了	$EXT->_call_hook('post_controller_constructor');/* * ------------------------------------------------------ *  Call the requested method * ------------------------------------------------------ */	// Is there a "remap" function? If so, we call it instead	if (method_exists($CI, '_remap'))	{		$CI->_remap($method, array_slice($URI->rsegments, 2));	}	else	{		// is_callable() returns TRUE on some versions of PHP 5 for private and protected		// methods, so we'll use this workaround for consistent behavior		if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))		{			// Check and see if we are using a 404 override and use it.			if ( ! empty($RTR->routes['404_override']))			{				$x = explode('/', $RTR->routes['404_override']);				$class = $x[0];				$method = (isset($x[1]) ? $x[1] : 'index');				if ( ! class_exists($class))				{					if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))					{						show_404("{$class}/{$method}");					}					include_once(APPPATH.'controllers/'.$class.'.php');					unset($CI);					$CI = new $class();				}			}			else			{				show_404("{$class}/{$method}");			}		}		// 终于调用方法了,$this->load->view()把内容放到缓存区		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));	}	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');	$EXT->_call_hook('post_controller');        //这里就是把缓存区的内容输出了	if ($EXT->_call_hook('display_override') === FALSE)	{                		$OUT->_display();	}	$EXT->_call_hook('post_system');        //关闭数据库的链接	if (class_exists('CI_DB') AND isset($CI->db))	{		$CI->db->close();	}

PHP培训技术

本文由欣才IT学院整理发布,未经许可,禁止转载。
支持20不支持0