MySQLi Singleton

时间:2013-11-26 23:17:34

标签: php mysqli singleton

这足以在php中制作单身吗?

public static function getInstance() {
   if (!isset(self::$intance)) {
     self::$instance = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
   }
   return self::$instance;
 }

我发现它最容易,比我在这里看到的任何东西都容易。可以有任何问题吗?

3 个答案:

答案 0 :(得分:0)

你不能让原始的mysqli类成为一个单身 - 这实际上是一件好事,因为单身人士是邪恶的(如果需要我会详细介绍)。

您所做的是技术上称为静态工厂方法,它只返回第一个创建的数据库对象实例。这实际上比使用单例更好,因为您也可能删除该实例以进行测试以创建另一个实例,另一个实例...

但根据我的经验,您通常很乐意在代码中使用多个数据库连接。只需考虑使用两个用户帐户,一个用于管理员用户,另一个用于常规用户。仅此一项就可以作为两个数据库连接,如果您的代码只能处理“唯一一个实例”,而无需选择登录凭据,那将是一件坏事。我建议不要这样做。

答案 1 :(得分:0)

这是单身类:

class DataBase
{
  private static $mysqli;

  final private function __construct() {}

  public static function getInstance()
  {
    if (!is_object(self::$mysqli)) self::$mysqli = new mysqli($H,$U,$P,$B);
    return self::$mysqli;
  }

  private function __destruct()
  {
    if (self::$mysqli) self::$mysqli->close();
  }

  private function __clone() {}
}

重要的是:

  • 变量(存储数据库连接)是静态的
  • 构造函数是私有的(不能被调用)(最终不能被覆盖)
  • 函数返回对象也是静态的(通常函数getInstance在这里)
  • 不允许克隆单例类,因此__clone()函数必须为空
  • 析构函数__destruct由垃圾收集器调用,应该完成状态

所以这个数据库连接从其他类调用为:

$db=DataBase::getInstance();

不是

$db=new DataBase();

答案 2 :(得分:-1)

使用我自己的一个整合评论中的更改。不是依赖常量,而是将变量传递给getInstance /构造函数,以便您可以以任何方式存储凭证,并将它们提供给类,而不必让类依赖于以某种方式存储的数据。增加了一点灵活性。

您也可以将其与代码交换以从配置文件中读取它们,或者从服务定位器类型模式中获取数据。

Class MysqlConnection {
  private static $instance = null;
  private function __construct() {
    self::$instance = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_DATABASE);
  }

  public static function getInstance() {
    if (!isset(self::$instance)) {
      $credentials = self::getCredentials();
      self::$instance = new MysqlConnection();
    }
      return self::$instance;
    }
  }

  function __clone() {
    //Throw exception/custom exception type here.
  }
}

编辑评论:这个想法不是概括完全100%使用这里的类,而是代表我的立场和方法。凭证位不是100%必要的,它只是我感觉如何使它更灵活,而不是硬编码它只使用CONSTANTS等。这可能分散了初始点,这是一个单身人士的样子。我为这种困惑道歉。