yii的单例模式实现


这是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。

Archives