您的位置:首页 > 编程语言 > PHP开发

CI框架学习总结

2016-01-20 15:26 696 查看
之前主要搞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,包含几个关键目录:

config文件夹,存放一些配置文件,包括路由(routes.php)、数据库(database.php)、基本配置(config.php,如base_url、charset等)、memcache.php、需要自动加载的底层对象(autoload.php)等;

controllers文件夹,C层文件都存放在这个文件夹中,因为是按类名classname在该文件夹中检索(classname.php)的文件,所以类名要与文件名相同。controller类继承CI_Controller类,在构造函数中首先调用父类的构造函数parent:__construct,需要加载M层自定义类时,调用
$this->load->model("pages_model");
pages_model就可以作为Controller类的一个属性来调用了;

model文件夹,M层文件,主要封装一些底层数据文件,如数据库等。

view文件夹,V层文件,主要保存前端的一些文件,包括css、js、html(需要定义为.php文件)。可以在controller层通过
$this->load->view('templates/header', $data);
来加载需要的V层文件。

其他文件夹,因为没用到,就不介绍了。

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