转载链接:http://tech.ddvip.com/2013-11/1384432766205970.html

一  程序入口

<?php// change the following paths if necessary
$yii=dirname(__FILE__).'/http://www.cnblogs.com/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';// remove the following line when in production mode
// defined('YII_DEBUG') or define('YII_DEBUG',true);require_once($yii);
Yii::createWebApplication($config)->run();

require_once($yii) 语句包含了yii.php 文件,该文件是Yii bootstrap file,包含了 yiibase的基础类,yii完全继承了yiibase

<?php
/*** Yii bootstrap file.** @author Qiang Xue <qiang.xue@gmail.com>* @link http://www.yiiframework.com/* @copyright Copyright © 2008-2011 Yii Software LLC* @license http://www.yiiframework.com/license/* @version $Id: yii.php 2799 2011-01-01 19:31:13Z qiang.xue $* @package system* @since 1.0*/require(dirname(__FILE__).'/YiiBase.php');/*** Yii is a helper class serving common framework functionalities.** It encapsulates {@link YiiBase} which provides the actual implementation.* By writing your own Yii class, you can customize some functionalities of YiiBase.** @author Qiang Xue <qiang.xue@gmail.com>* @version $Id: yii.php 2799 2011-01-01 19:31:13Z qiang.xue $* @package system* @since 1.0*/
class Yii extends YiiBase
{
}

在 YiiBase 类中 定义了一些 比如:

public static function createWebApplication($config=null) // 创建启动public static function import($alias,$forceInclude=false) // 类导入public static function createComponent($config) // 创建组件public static function setApplication($app)  // 创建类的实例 yii::app()

二 自动加载机制

还有比较重要的yii自动加载机制,在yiibase的最后引用了php的标准库函数 spl_autoload_register(array('YiiBase','autoload')) 调用框架中的autoload方法

/*** Class autoload loader.* This method is provided to be invoked within an __autoload() magic method.* @param string $className class name* @return boolean whether the class has been loaded successfully*/public static function autoload($className){// use include so that the error PHP file may appearif(isset(self::$classMap[$className]))include(self::$classMap[$className]);else if(isset(self::$_coreClasses[$className]))include(YII_PATH.self::$_coreClasses[$className]);else{// include class file relying on include_pathif(strpos($className,'')===false)  // class without namespace{if(self::$enableIncludePath===false){foreach(self::$_includePaths as $path){$classFile=$path.DIRECTORY_SEPARATOR.$className.'.php';if(is_file($classFile)){include($classFile);break;}}}elseinclude($className.'.php');}else  // class name with namespace in PHP 5.3{$namespace=str_replace('','.',ltrim($className,''));if(($path=self::getPathOfAlias($namespace))!==false)include($path.'.php');elsereturn false;}return class_exists($className,false) || interface_exists($className,false);}return true;}

静态成员 $_coreClasses 变量中定义了一些系统自身的核心类

private static $_coreClasses=array('CApplication' => '/base/CApplication.php','CApplicationComponent' => '/base/CApplicationComponent.php','CBehavior' => '/base/CBehavior.php','CComponent' => '/base/CComponent.php',

非 coreClasse 的类注册在YiiBase的$_classes 数组中:

private static $_classes=array();

其他的类需要用Yii::import()讲类路径导入PHP include paths 中,直接

include($className.'.php')

三 CWebApplication的创建

Yii::createWebApplication($config)->run(); 调用createWebApplication函数

public static function createWebApplication($config=null){return self::createApplication('CWebApplication',$config); // 函数中调用createApplication}
public static function createApplication($class,$config=null){return new $class($config);}

返回 CWebApplication类的实例

现在autoload机制开始工作了。

当系统 执行 new CWebApplication() 的时候,会自动

include(YII_PATH.'/base/CApplication.php')

几个类的继承关系是 CWebApplication->CApplication->CModule->CComponent

$config 首先传递到CApplication的构造函数中,

public function __construct($config=null){Yii::setApplication($this); // 返回自身的实例,之后可以通过 yii::app() 全局调用// set basePath at early as possible to avoid troubleif(is_string($config))$config=require($config);if(isset($config['basePath'])){$this->setBasePath($config['basePath']);unset($config['basePath']);}else$this->setBasePath('protected'); // 设置路径 指向protected 目录Yii::setPathOfAlias('application',$this->getBasePath());Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');$this->preinit();$this->initSystemHandlers(); 设置error 和 exception$this->registerCoreComponents(); 注册核心组件,放入_componentConfig 静态变量中$this->configure($config); // 把配置文件数组循环,设置为自身属性$this->attachBehaviors($this->behaviors); // 设置行为$this->preloadComponents(); // 预加载$this->init();  // 加载请求处理模块,开始处理请求}

大概过程

application构造函数:

1 设置当前运行实例

2 获取配置参数

3 设置basepath

4 设置几个path;application,webroot ,ext

5 preinit

6 注册error、exception处理函数 initSystemHandlers

7 加载核心组件 registerCoreComponents 包括webapplication的和application的

8 设置配置文件 configure($config)

9 附加行为 $this->attachBehaviors($this->behaviors);

10处理加载config中的preload,//通过getComponent分别加载并初始化 $this->preloadComponents();

11 初始化init(); //加载CHttpRequest组件

PHP yii 框架源码阅读(二) - 整体执行流程分析相关推荐

  1. 深入了解junit及Statement源码 ,了解整体执行流程

    简介 junit 基于java语言的单元测试类框架 Statement 对一个单元运行的封装,每个Statement都只是执行它本身所表达的逻辑,而将其他逻辑交给下一个Statement处理,而且基本 ...

  2. mybatis源码学习篇之——执行流程分析

    前言 在正式学习mybatis框架源码之前,需要先弄懂几个问题?myabtis框架是什么?为什么需要mybatis框架?使用mybatis框架带来的好处是什么? 回答这几个问题之前,我们先来看一下,之 ...

  3. PHP yii 框架源码阅读(一)

    转载链接:http://www.th7.cn/Program/php/2012/04/03/67983.shtml 目录文件 |- framework 框架核心库 |-|- base 底层类库文件夹, ...

  4. datax源码阅读二:Engine流程

    一.根据前面python文件知道,java的main函数是com.alibaba.datax.core.Engine public static void main(String[] args) th ...

  5. php yii框架源码,yii 源码解读

    date: 2017-11-21 18:15:18 title: yii 源码解读 本篇博客阅读指南: php & 代码提示: 工欲善其事必先利其器 yii 源码阅读指南: 整体上全貌上进行了 ...

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

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

  7. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

  8. php+yii框架,yii框架源码分析(一)

    yii框架源码分析(一) 本文将对yii中的mvc,路由器,filter,组件机制等最主要的部分进行自己的一点浅析,力求说明自己做一个php mvc不是那么的遥不可及,其实是很简单的. 源码基于yii ...

  9. Spring框架源码阅读读后感

    Spring框架源码阅读读后感 spring的bean生命周期,从上到下依次完成,本人在阅读源码时总结得出此步骤,当然,spring是一个强大的框架,其对bean的生命周期管理只是其中的一部分,本人也 ...

最新文章

  1. python爬虫写入数据库_Python爬虫数据写入操作
  2. 《Raspberry Pi用户指南》——2.4 使用外部存储设备
  3. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  4. 史上最详细的XGBoost实战
  5. js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind
  6. redis启动警告解决
  7. ecplise最有用的8个快捷键
  8. Golang实现简单爬虫框架(5)——项目重构与数据存储
  9. .NetCore下使用NPOI绘制统计图表
  10. android 开发者模式进入
  11. 【AI视野·今日CV 计算机视觉论文速览 第220期】Wed, 16 Jun 2021
  12. 自学python在家干什么好_在家这么多天,职场人在家能自学什么?
  13. win10怎么更改c盘用户计算机名,详解win10系统更改c盘用户名文件夹名称的设置技巧...
  14. Hive 取非 Group by 字段数据的方法
  15. 【ARM】程序快速定位segmentation fault core dumped错误
  16. 最优秀的六种造字方法
  17. V神最新演讲:万字长文透露以太坊20重大升级!
  18. AI值得信任吗?“可信AI”或能给出答案
  19. 中望3D 2021 自动标注
  20. 信息安全系统设计基础期中总结

热门文章

  1. linux如何利用命令保存文件,如何在Linux中将命令输出保存到文件?
  2. Linux 内核获取、初次编译、源码目录分析
  3. Ubuntu下软件的安装、卸载方法
  4. 用python做数据分析pdf_利用python进行数据分析pdf
  5. php程序里如何实现图片翻页,php图片上传代码一例-php 生成翻页链接(页码)列表的...-带多种分页方式的php分页类_169IT.COM...
  6. Android九点阵手势识别,能量黑科技模块八-九:两路按键颜色手势魔块
  7. 下载的java游戏怎么运行不了_java运行环境下载
  8. 网络安全:堡垒机相关知识介绍
  9. 操作系统:体验Windows 11,不到1M的小工具来了!
  10. 程序人生:这5个程序员,改变了世界,你都认识吗!