Nar*_*rek 3 singleton design-patterns yii
在Yii我能做到:
$model = ModelName::model();
Run Code Online (Sandbox Code Playgroud)
我可以从任何地方调用它,它将始终返回相同的实例.
那我可以决定Yii使用Singleton模式吗?
唯一的区别就是我看到的是__construct,__clone,__wakeup得不到保护.
是的,YII应用程序对象是单例.如果您看到Yii条目文件,即index.php,您可以找到该语句
Yii::createWebApplication($configFile)->run();
Run Code Online (Sandbox Code Playgroud)
这是为您的应用程序创建实例的状态.
Yii是一个类,它扩展了YiiBase.
class Yii extends YiiBase{}
Run Code Online (Sandbox Code Playgroud)createWebApplication()是YiiBase类中的静态功能区.此函数返回CWebApplication类的对象.
public static function createWebApplication($config=null)
{
return self::createApplication('CWebApplication',$config);
}
Run Code Online (Sandbox Code Playgroud)createAppliction('CWebApplication',$config) 创建对象CWebApplication并返回该对象.
现在,可以在应用程序的任何位置访问此应用程序单例Yii::app().
要检查更多
<?php
echo "<pre>";
print_r(Yii::app());
echo "</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
即将推出模型,YII也为Active record Model提供单例模式.
转到yii/framework/yiilite.php.
找到CActiveRecord抽象类,并搜索函数模型()
public static function model($className = __CLASS__)
{
if (isset(self::$_models[$className]))
return self::$_models[$className];
else
{
$model = self::$_models[$className] = new $className(null);
$model->attachBehaviors($model->behaviors());
return $model;
}
}
Run Code Online (Sandbox Code Playgroud)理解这一行
if(isset(self::$_models[$className]))
return self::$_models[$className];
Run Code Online (Sandbox Code Playgroud)
可能这会给你更多信息.