今天开始阅读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 }