我见过的所有单例模式都使用对对象的引用来确定对象是否已被实例化。但是,如果我使用单例来保证只有一个数据库连接,为什么不使用数据库连接资源链接来做到这一点呢?这是我正在使用的代码。 (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/