CI框架学习总结

之前主要搞C++,现在学习PHP,为了能够快速的理解MVC框架,根据buddy的建议,就选择了轻量级框架-CI,使用起来确实简单易学,并有详细的中文文档可够查阅。

CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。
                                                            -摘自官网

目录结构

CI框架的核心文件都存放在system文件夹中,在根目录下的index.php中可以通过变量$application_folder = 'application';配置用户目录文件夹,一般定义在件在application文件夹中。system/core/CodeIgniter.php文件为框架的入口文件。

URI字段含义:sites.com/index.php/C/m/param1/param2/.....
C字段为routes.php中定义需要调用的controller类名,m为该类中的方法,param1….为参数可以在定义方法时来设定参数,从而该值自动传递给该方法;也可以通过$this->uri->segment_array(); 来返回字段数组,arrary( 1=>controller, 2=>method, 3=>param1, ….)。
对于URL字段路由规则在application/config/routes.php中来进行配置,格式:

$route['pages/editor'] = 'pages/editor';
$route['default_controller'] = 'pages'; //默认Controller
$route['news/(:any)'] = 'news/view/$1'; 
$route['news'] = 'news';  //news字段解析news Controller

下面,主要说一下application,包含几个关键目录:

  1. config文件夹,存放一些配置文件,包括路由(routes.php)、数据库(database.php)、基本配置(config.php,如base_url、charset等)、memcache.php、需要自动加载的底层对象(autoload.php)等;
  2. controllers文件夹,C层文件都存放在这个文件夹中,因为是按类名classname在该文件夹中检索(classname.php)的文件,所以类名要与文件名相同。controller类继承CI_Controller类,在构造函数中首先调用父类的构造函数parent:__construct,需要加载M层自定义类时,调用$this->load->model("pages_model"); pages_model就可以作为Controller类的一个属性来调用了;
  3. model文件夹,M层文件,主要封装一些底层数据文件,如数据库等。
  4. view文件夹,V层文件,主要保存前端的一些文件,包括css、js、html(需要定义为.php文件)。可以在controller层通过$this->load->view('templates/header', $data); 来加载需要的V层文件。
  5. 其他文件夹,因为没用到,就不介绍了。

MVC实现原理

前面balabala.了.MVC文件布局,并没有说框架的实现机制,现在简单介绍一下,如何实现控制层,数据层,视图层分离的:

codeignite.php
$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);

在codeignite.php中根据实例化Router类$RTR。在Router类的构造函数中会读取routers.php配置文件、解析URI字段,并设置Router::class (controller) 和Router::method属性;

 codeignite.php  
 $class = ucfirst($RTR->class);  
 $method = $RTR->method;
 .......... 
 $CI = new $class(); 

实例化controller类。Controller采用单例模式,全局只有一个controller类,可以通过coderignite.php中get_instance()方法返回,该实例。

CI_Controller.php
$this->load =& load_class('Loader', 'core');
$this->load->initialize();

在CI_Controller构造函数中实例化Loader类。Loader类主要用来设置controller中的属性,例如model,helper,library中封装的类,通过在controller中调用:

controller:
$this->load->model("pages_model");
$this->load->helper('url_helper');
$this->load->library('session');

这样就可以使用model层封装的对象了。
加载view层原理:

$this->load->view('templates/header', $data);

通过Loader::view()方法来实现,view()调用_ci_load()来实现:

Loader.php
/** * Internal CI Data Loader * * Used to load views and files.用来加载view层文件 * * Variables are prefixed with _ci_ to avoid symbol collision with * variables made available to view files. * * @used-by CI_Loader::view() * @used-by CI_Loader::file() * @param array $_ci_data Data to load * @return object */
    protected function _ci_load($_ci_data)
    {..................}
Loader.php
// This allows anything loaded using $this->load (views, files, etc.)
// to become accessible from within the Controller and Model functions.
$_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;
    }
}

将Controller中的所有数据复制到Loader类中从而使所有的controller数据可以在view层使用,这也是为什么我在一开始使用CI时,发现controller中的所有数据可以通过$this调用。
最后通过

if ( ! is_php( '5.4' ) && ! ini_get('short_open_tag') && 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
}

include view层定义的文件。

总结

CI框架总体通过使用一个单例的CI_Controller对象来进行操作,它包含一个属性CI_Controller::load来加载所有需要的文件,并将CI_Controller中的属性引用到Loader类中,从而可以在view层使用。
CI框架整体结构比较清晰,代码量较少,比较适合初接触MVC框架的同学。

代码

git代码地址

你可能感兴趣的:(PHP,框架,CodeIgniter)