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()

  

posted on 2014-02-08 11:10  茶壶81  阅读(1566)  评论(1)    收藏  举报

导航