Yii源码阅读心得(持续更新)
今天开始阅读Yii的源码,想深入了解一下Yii的工作原理,同时学习一下优秀的编码规范和风格。在次记录一下阅读中的小心得。
就从Yii自动生成的网站入口开始吧。
index.php
整个网站的入口,主要对一些路径和参数的配置,并启动web应用。
1 $yii=dirname(__FILE__).'/../yii/framework/yii.php';
2 $config=dirname(__FILE__).'/protected/config/main.php';
3
4 defined('YII_DEBUG') or define('YII_DEBUG',true);
5 // specify how many levels of call stack should be shown in each log message
6 defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
7
8 require_once($yii);
9 Yii::createWebApplication($config)->run();
2 $config=dirname(__FILE__).'/protected/config/main.php';
3
4 defined('YII_DEBUG') or define('YII_DEBUG',true);
5 // specify how many levels of call stack should be shown in each log message
6 defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
7
8 require_once($yii);
9 Yii::createWebApplication($config)->run();
第4行短路语句的形式会经常用到:如果已经定义了Yii_DEBUG, 则or后面的语句将不会执行。
第8行将yii框架的内容包含进来,那么顺着执行流程去看看yii.php。
yii.php
1 require(dirname(__FILE__).'/YiiBase.php');
2
3 class Yii extends YiiBase{}
2
3 class Yii extends YiiBase{}
这个文件很简单,只有两行,其实是一个框架功能的辅助类,用户可以编写自己的Yii类来定制YiiBase的相关功能。
注:dirname(__FILE__)指当前文件的绝对路径,这要写要比../便于维护。
YiiBase.php
YiiBase类为Yii框架提供了公共的基础功能,如:
这里有一个地方值得注意,即系统分隔符的使用,如下:
defined('YII_ZII_PATH') or define('YII_ZII_PATH',YII_PATH.DIRECTORY_SEPARATOR.'zii');
因为windows下是'\',linux下是'/',用DIRECTORY_SEPARATOR就能很好地解决。
还有一个很巧妙地实现singleton的地方,可以将空的$_app赋值,也可以将非空$_app删除,即赋为null:
1 public static function setApplication($app)
2 {
3 if(self::$_app===null || $app===null)
4 self::$_app=$app;
5 else
6 throw new CException(Yii::t('yii','Yii application can only be created once.'));
7 }
2 {
3 if(self::$_app===null || $app===null)
4 self::$_app=$app;
5 else
6 throw new CException(Yii::t('yii','Yii application can only be created once.'));
7 }