这是CApplication类的部分代码
class CApplication extends CModule { public function __construct($config=null) { Yii::setApplication($this); . . } }
下面是YiiBasede 的代码
class YiiBase { private static $_app; public static function app() { return self::$_app; } public static function setApplication($app) { if(self::$_app===null || $app===null) self::$_app=$app; else throw new CException(Yii::t('yii','Yii application can only be created once.')); } }
当在入口文件创建Yii应用时,CApplication的构造函数会被调用,并且将CApplication的实例写入Yii的静态成员$_app。
Yii::createWebApplication($config)->run();
一开始,我不明白这种写法的用意,今天跟同事谈起这个代码,我仔细回味了一下,这也许是yii为了更好的扩展而这样设计的。
在YiiBase中的setApplication强制只允许设置一个CApplication 实例,而CApplication 的构造函数在一开始就调用这个静态方法,从而防止CApplication 的实例被重复创建。
这样做的一个好处是我们可以更加自由灵活地定制CApplication。