Yii是否使用Singleton?

Nar*_*rek 3 singleton design-patterns yii

Yii我能做到:

$model = ModelName::model();
Run Code Online (Sandbox Code Playgroud)

我可以从任何地方调用它,它将始终返回相同的实例.

那我可以决定Yii使用Singleton模式吗?

唯一的区别就是我看到的是__construct,__clone,__wakeup得不到保护.

Hea*_*man 7

是的,YII应用程序对象是单例.如果您看到Yii条目文件,即index.php,您可以找到该语句

   Yii::createWebApplication($configFile)->run();
Run Code Online (Sandbox Code Playgroud)

这是为您的应用程序创建实例的状态.

  1. Yii是一个类,它扩展了YiiBase.

       class Yii extends YiiBase{}
    
    Run Code Online (Sandbox Code Playgroud)
  2. createWebApplication()是YiiBase类中的静态功能区.此函数返回CWebApplication类的对象.

    public static function createWebApplication($config=null)
    {
         return self::createApplication('CWebApplication',$config);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 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提供单例模式.

  1. 转到yii/framework/yiilite.php.

  2. 找到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)

可能这会给你更多信息.