【发布时间】:2011-02-19 22:04:19
【问题描述】:
我不想就单例比静态更好或比全局更好等进行讨论。我在 SO 上阅读了许多关于类似主题的问题,但我无法回答这个具体问题,所以我希望现在有人可以通过一个(或多个)真正简单的示例回答这个问题来启发我,而不仅仅是理论上的讨论。
在我的应用程序中,我有典型的 DB 类来抽象 DB 层并在 DB 上执行任务,而无需在代码中到处写 mysql_connect / mysql_select_db / mysql...
我可以将这个类写成 STATIC CLASS:
class DB
{
private static $connection = FALSE; //connection to be opened
//DB connection values
private static $server = NULL; private static $usr = NULL; private static $psw = NULL; private static $name = NULL;
public static function init($db_server, $db_usr, $db_psw, $db_name)
{
//simply stores connections values, without opening connection
}
public static function query($query_string)
{
//performs query over alerady opened connection, if not open, it opens connection 1st
}
...
}
或作为单身人士:
class DBSingleton
{
private $inst = NULL;
private $connection = FALSE; //connection to be opened
//DB connection values
private $server = NULL; private $usr = NULL; private $psw = NULL; private $name = NULL;
public static function getInstance($db_server, $db_usr, $db_psw, $db_name)
{
//simply stores connections values, without opening connection
if($inst === NULL)
$this->inst = new DBSingleton();
return $this->inst;
}
private __construct()...
public function query($query_string)
{
//performs query over already opened connection, if connection is not open, it opens connection 1st
}
...
}
然后在我的应用程序中,如果我想查询我可以做的数据库
//Performing query using static DB object
DB:init(HOST, USR, PSW, DB_NAME);
DB::query("SELECT...");
//Performing query using DB singleton
$temp = DBSingleton::getInstance(HOST, USR, PSW, DB_NAME);
$temp->query("SELECT...");
对我来说,Singleton 的唯一优势是避免将类的每个方法声明为 static。我相信你们中的一些人可以给我一个示例,说明在这个特定情况中单例的真正优势。提前致谢。
【问题讨论】:
-
投了反对票的可以留言解释一下。
-
绝对没有必要将数据库类设为单例或表现为静态类。我的意思是它有什么用途?如果您正在寻找同时需要两个不同数据库连接的应用程序,那么您基本上已经搞砸了。允许多个实例的类完全可以延迟初始化(实际连接)。
-
@fireeyedboy:感谢您的评论,但我不完全理解您的意思。最后,您认为单例类还是静态类更好,为什么?
-
以上都不是。 :) 我强烈建议不要使用这两个选项中的任何一个。为什么你觉得这两个选项之一是必要的?
-
请参阅我的回答,了解如何实现延迟加载连接并保持灵活性。
标签: php database oop static singleton