这足以在php中制作单身吗?
public static function getInstance() {
if (!isset(self::$intance)) {
self::$instance = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
}
return self::$instance;
}
我发现它最容易,比我在这里看到的任何东西都容易。可以有任何问题吗?
答案 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() {}
}
重要的是:
所以这个数据库连接从其他类调用为:
$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等。这可能分散了初始点,这是一个单身人士的样子。我为这种困惑道歉。