php - 一个更简单的单例

标签 php

我见过的所有单例模式都使用对对象的引用来确定对象是否已被实例化。但是,如果我使用单例来保证只有一个数据库连接,为什么不使用数据库连接资源链接来做到这一点呢?这是我正在使用的代码。 (PS:它工作正常)。我使用评论可以轻松搜索我的类(class)。

/*one*/

class one
  {
  public static $db;
  private function __construct()
    {
    self::$db=new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
    }
  public static function get()
    {
    if(self::$db==NULL)
      {
      new self();
      }
    return self::$db;
    }
  }

最佳答案

在 PHP 中,构造函数不返回。

因此您的get 方法返回一个one 对象,第一次调用它时,然后返回一个mysqli 对象。可能不是您想要的。

if( self::$_db == NULL )
{
    return new self(); // Here you return an object of class one
}
else
{
    return self::$_db; // Here you return an object of type mysqli
}

如果你想返回 mysqli 对象,你不需要单例,因为不需要创建一个对象的实例,它只是在这里返回另一个对象的实例。

在这种情况下,注册表模式会更好。

如果您需要提供方法(您的数据库对象的包装器),则创建一个真正的单例。

编辑

我检查了你更新的代码。 现在你总是返回 mysqli 实例。但是你不需要实例化你自己的对象。那完全没用...

如果你真的想使用你的模式,正如 golden 所说,在你的静态实例中,检查 self::db 是否为 NULL。如果是,则创建 mysqli 实例,并将其分配给 self::db。然后返回它。

public static getDatabaseInstance()
{
    if( self::$_db == NULL )
    {
        self::$_db = new mysqli( ... );
    }

    return self::$_db;
}

同时将构造函数设置为私有(private),这样用户将无法创建您的类的无用实例。或者更好地将其公开并抛出异常:

public function __construct()
{
    throw new Exception( 'This class is not supposed to be instantiated' );
}

关于php - 一个更简单的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368660/

相关文章:

Php表单将内容添加到列而不覆盖

php - 从 PHP 变量中过滤特定标签内容?

javascript - PHP INSERT 准备好的语句不使用 ajax 插入

php - 记录未显示为已保存

javascript - 如何防止用户更改 HTML 或 JavaScript 中的值

php - PHP 对象实例可以知道它的名字吗?

php - count(array)返回1,但数组为空

php - 编译PHP,出现这些错误正常吗? (Linux-Debian-PHP5.3.3)

php - 使用 CodeBird (PHP) 发布推文时使用短网址

php - MySQL Join 显示具有相同值的多行