有人说phper的深入要从研读mvc框架开始,我跳了一个常用的CI框架入手,主要是因为 CI框架简单轻巧,可以自己DIY功能!!!

1、首先来看CI的整体架构图:

其中:application是用户级开发目录,我们关心system系统源码目录,CI的核心代码都在这里了。

1、core 系统核心代码

2、database数据库相关的操作和帮助类

3、helpers 系统提供的一些工具类

4、language 语言包

5、libraries 系统依赖类

2、CI的代码流程

我们初次访问CI的时候进入的welcome页面,那么这个welcome的页面请求都经过了哪些地方呢,我们来追踪一下。

所以对ci的请求,都是首先进入index.php文件。在index.php文件中进行CI框架的初始化操作,

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');

define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));

define('BASEPATH', $system_path);

define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

define('SYSDIR', basename(BASEPATH));

define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);

define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);

require_once BASEPATH.'core/CodeIgniter.php';

在index.php文件中定义了必要的全局变量,最后引入了core/CodeIgniter.php核心类。那我们追踪到core/CodeIgniter.php中,文件中首先引入了:

require_once(APPPATH.'config/constants.php');

require_once(BASEPATH.'core/Common.php');

之后又实例化了 Benchmark、Hooks、Config、Log、Utf8、URI、Router、Output、Security、Input、Lang 类,引入是调用common.php中的load_class方法实现的。

$class = ucfirst($RTR->class);

$method = $RTR->method;

在路由中提取出对应要调用的class和method,然后实例化class且调用方法:

$CI = new $class();

call_user_func_array(array(&$CI, $method), $params);

其前后调用了四个钩子:

$EXT->call_hook('pre_controller');

$EXT->call_hook('post_controller_constructor');

$EXT->call_hook('post_controller');

$EXT->call_hook('post_system');

这里解析出的class和method,其实就是Welcome和index,之后我们 进入application/controllers/Welcome.php类后发现,类里只有

public function index(){

   $this->load->view('welcome_message');

}

简单的 加载模板方法,我们看到Welcome 类继承自父类:CI_Controller

我们进入CI_Controller类中查看:

public function __construct(){

self::$instance =& $this;

foreach (is_loaded() as $var => $class){

$this->$var =& load_class($class);

}$this->load =& load_class('Loader', 'core');

$this->load->initialize();

log_message('info', 'Controller Class Initialized');

}

这段构造函数是将,在引导类CodeIgniter.php被实例化化的类赋值到本地类变量中,以构造一个超级对象被使用。同时实现了一个单例 公外部调用。

那是如何赋值的那,这里调用了 common类 中的is_loader()方法。其实就是返回的我们在上面

调用load_class()加载过的类:

最后初始化成功后,会执行CodeIgniter.php文件中的:

call_user_func_array(array(&$CI, $method), $params);

这个函数,从而进入我们welcome控制器的index方法。

大致的流程就是如此,可以根据自己的想法去实现功能,开发有意思的功能模块!!!!

CI框架源码研读(整体架构)的更多相关文章

  1. MyBatis 源码篇-整体架构

    MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...

  2. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  3. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  4. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  5. CI框架源码阅读笔记2 一切的入口 index.php

    上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...

  6. CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程

    最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时 ...

  7. Fresco 源码分析 —— 整体架构

    Fresco 是我们项目中图片加载专用框架.虽然我不是负责 Fresco 框架,但是由本人负责组里的图片加载浏览等工作,因此了解 Fresco 的源码有助于我今后的工作,也可以学习 Fresco 的源 ...

  8. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. 【深入浅出jQuery】源码浅析--整体架构(转)

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

随机推荐

  1. (微信小程序)二 : 创建一个页面。

    首先先看一下pages的目录结构吧. 我创建了一个topics页面.3个文件全创建好了之后 我往topics.js添加数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. [android] 天气app布局练习(四)

    主要练习一下获取网络数据和解析xml MainActivity.java package com.example.weatherreport; import java.io.UnsupportedEn ...

  3. Toolbar和Drawerlayout的基本使用

    参考文章: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html http://www.codeceo.c ...

  4. vcfc之zk+postsql+keystore(cassandra)框架分析

    vcfc框架总结: 1 一. bus和keystore是如何协调处理的,什么样的问题是处理不了的? 1. 如果在备重启的过程中,主处理了某个时间1,备机如果同步数据呢? 二 .数据可靠性和一致性分析 ...

  5. struts2 执行流程及工作原理

    在Struts2框架中的处理大概分为以下的步骤  1 用户发送请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过 ...

  6. pyhton基础

    python是一种什么语言?python是一种动态解释性的强类型定义的语言(1)编程语言分类 编译型: 把源程序的每一条语句都编译成机器语言,并保存成二进制文件, 这样运行时计算机可以直接以机器语言来 ...

  7. 深入理解ES6之函数

    一:关于函数的参数: 可以接受任意数量的参数而无视函数声明的参数数量是js函数的独特之处. 1:参数默认值 ES6之前做法: function makeRequest(url,timeout,call ...

  8. MySQL行(记录)详细操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  9. memset用法详解

    原文:http://www.cnblogs.com/PegasusWang/archive/2013/01/20/2868824.html 1.void *memset(void *s,int c,s ...

  10. 【Markdown】Markdown 使用MathJax引擎 书写Latex 数学公式

    大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中添加MathJax引擎也很简单, <script type=" ...