Lory 发表于 2012-10-5 17:29:21

控制器中载入单例模式的类对象

各位大大们,刚刚在学PHP的设计模式,其中有个单元素模式(单例模式),它的实现会把构造函数设成私有或者保护型,这样在控制器里如何去加载呢?
$this->load->model('user');
使用这种方法,它默认会去调用user类的构造函数,于是产生错误
请问应该如何在 CI 框架下使用这种设计模式呢?先谢谢啦~~

<?Php

class User extends CI_Model
{
    private static         $user = null;
    private             $Username;
    private                $Balance;
    private                $TransactoinIndex;
   
    private function __construct($strUsername)
    {
      parent::__construct();
   
      $this->Username         = $strUsername;
      
      // 从数据库加载此用户的资料
      $this->Balance          = 100.00;
      $this->TransactionIndex = 1;
    }
   
    public static function Login($strUsername, $strPassword)
    {
      // 查询数据库,如果用户登陆成功,则创建唯一实例对象
      if ($strUsername == 'Lory' && $strPassword == '123456')
      {
            CUser::$user = new CUser('Lory');
      }
      
      return CUser::$user;
    }
   
    public static function GetUser()
    {
      return CUser::$user;
    }
   
    public function PrintInfo()
    {
      echo "Username: {$this->Username}<br>";
      echo "Balance: {$this->Balance}<br>";
      echo "TransactionIndex: {$this->TransactionIndex}<br>";
    }
}

?>


Lory 发表于 2012-10-5 18:05:17

通过搜索以前的帖子,Hex同学说通过 CI 框架在control, model里通过 $this->load->xxx 的方式加载已经是单例了,于是我做了个实验,确实是如此,感谢~~

这是Model的代码,命名:test.php

<?Php

class Test extends CI_Model
{
    public function __construct()
    {
      parent::__construct();
      
      echo "Constructer is called<br>";
    }
}

?>



在控制器中,测试此代码:

class Welcome extends CI_Controller
{
    public function test()
    {
      $this->load->model('test');
      $this->load->model('test');
    }
}

然后从浏览器的输出中可以发现,"Constructer is called" 这句话只输出了一次,证明此类的构造函数确实只被调用了一次

页: [1]
查看完整版本: 控制器中载入单例模式的类对象