2013-11-26 19 views
-1

这是足够让php在单身人士?MySQLi Singleton

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

我发现它是最简单的方式,比我在这里看到的任何东西都容易。那有什么问题吗?

+0

您也可以尝试永久连接。 – hjpotter92

+2

如果(!isset(self :: $ intance)){'to'if(!isset(self :: $ instance)){''除非是拼写错误。 –

+1

对于单例使用情况已经足够了,如果您需要强制实现独特性,您还可以使构造函数保持私有状态,并在'__clone()'中引发异常,但是,就是这样。如果你不需要执行它,你甚至可以使用一个带有'static'变量的正常函数,避免需要类变量/可能直接访问它。 – Wrikken

回答

-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等。这可能会从初始点分散注意力,这是单身人士看起来的样子。我对这种混乱表示歉意。

+1

每次调用'getInstance'时,你都不会**想要传递主机,用户,密码和db名称。此外,你的类缺少静态'$ instance'属性。另外,构造函数不返回任何东西。 – Phil

+0

纠正所有计数。我想我匆匆穿过这个例子。编辑传入来修复该问题。 –

0

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

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

但是根据我的经验,您通常很乐意有一种方法来使用您的代码中不只有一个数据库连接。只需考虑使用两个用户帐户,一个用于管理员用户,另一个用于常规用途。仅此一项就有资格作为两个数据库连接,如果您的代码只能处理“唯一的一个实例”而没有选择登录凭证,这将是一件非常糟糕的事情。我建议反对它。

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();