Yii::app()的代码详解分析
在使用Yii框架的时候,你会发现很多地方都使用了'Yii::app()->functionName' 一般读过yii教程的人都明白 yii::app() 是返回yii的一个实例,但是这个实例是如何构成的呢,下面我们来分析一下
首先进入yii入口的程序index.php,因为任何应用都需要先经过这个入口才行:
Ok首先yi引入了'/../framework/yii.php' 的文件 ,然后引入'/protected/config/main.php'配置文件。接下来看最后一行代码
Yii::createWebApplication($config)->run();
由于引入了 '/../framework/yii.php' 文件,
这个yii又继承了yiiBase。所以yii 可以使用他父类中的任何方法,呢么我们来看一下 /../framework/yiiBase.php 中的文件吧
如上图找到createWebApplication这个方法,其实这个方法就是我们入口文件中使用的这个方法,呢么他执行了些设么呢,我们
根据返回的值,得出,他又执行了这个yiiBase中的createApplication的方法,并且传入了'CwebApplication和$config的参数'
那我们来看看这个createApplication的方法 到底干了些什么
这里已经很清楚了其实他就是实例化$class ,而这里的$class 就是CwebApplication。
OK。呢么很多人问实例化一个类不是要先引用这个类吗?没错!所以在BASE这个类中我们看到最后2行代码:
这里我们关心的是 spl_autoload_register 这个函数是用来注册 这个__autoload()函数用的,至于怎么个原理,我这里就不多说了
大家可以参考PHP手册,或者LINK这个地址http://www.cnblogs.com/myluke/archive/2011/06/25/2090119.html。
好了我们可以从__autoload() 这个函数中调用$_coreClasses函数 这个函数里面包含了大量的引用核心文件:
大家可以去看一下,这里面就有我们想要的CwebApplication 类文件的地址。GOOD!!呢么还犹豫什么我们进入这个类文件去看一下吧
又是一个继承 CApplication 怎么办呢,还是进父类看看吧,
大家在这里找到一个构造函数:我们看到,在构造函数的第一步,调用了Yii的setApplication方法,并传递了实例化出来的
CWebApplication对象,我们进入Yii的这个静态方法可以看到,Yii将创建出来的app对象赋值给了Yii的私有的静态属性$_app;
在Yii中我们又看到了这样的公共静态方法,在app()方法中,返回了它的私有静态属性$_app也就是CWebApplication对象
Well!!!!!!大家已经看明白了吧。蔸了呢么一大圈,终于看到app()其实就是CWebApplication实例化的一个对象,所以在接下
来的页面的任何地方,我们都可以调用Yii::app()来访问CWebApplication对象,并且它是个单例对象。
************************************************************************************************
总 结
你在index.php使用的配置文件,其实质就是对Yii::app()进行属性的初始化。配置文件里提供的就是属性名和属性值的
一个列表。任何 CWebApplication的公共成员或通过setter定义的属性都可以配置。注意有的属性配置可能比较复杂,
例如'components'属性。 这时可以参见对应的API信息寻求帮助(例如'components'对应的API就是setComponents()
浙公网安备 33010602011771号