我在php.net上的mysql-connect页面找到了一个db适配器
这是一个非常多的页面(我想象)。
它包括作者声称的单身模式类。
在http://php.net/manual/en/function.mysql-connect.php
上找到作家说:
“这是一个管理单个数据库连接的单例类 Open方法使用常量值作为defautls,从ini文件中读取 通过在每个网页顶部加载的初始化程序脚本。您 也可以通过手动输入自己的值来覆盖默认值(in 如果你需要在脚本中切换服务器或数据库名称)。 qry function接受一个准备好的语句并返回第一行, 第一个关联行,第一个单元格或整个结果集基于 第二个参数(如果省略则为整个结果)。“
用法:$ DB = DB :: Open();
$ result = $ DB-> qry(“{SQL Statement};”);
<?php
abstract class Database_Object
{
protected static $DB_Name;
protected static $DB_Open;
protected static $DB_Conn;
protected function __construct($database, $hostname, $hostport, $username, $password)
{
self::$DB_Name = $database;
self::$DB_Conn = mysql_connect($hostname . ":" . $hostport, $username, $password);
if (!self::$DB_Conn) { die('Critical Stop Error: Database Error<br />' . mysql_error()); }
mysql_select_db(self::$DB_Name, self::$DB_Conn);
}
private function __clone() {}
public function __destruct()
{
// mysql_close(self::$DB_Conn); <-- commented out due to current shared-link close 'feature'. If left in, causes a warning that this is not a valid link resource.
}
}
final class DB extends Database_Object
{
public static function Open($database = DB_NAME, $hostname = DB_HOST, $hostport = DB_PORT, $username = DB_USER,$password = DB_PASS)
{
if (!self::$DB_Open)
{
self::$DB_Open = new self($database, $hostname, $hostport, $username, $password);
}
else
{
self::$DB_Open = null;
self::$DB_Open = new self($database, $hostname, $hostport, $username, $password);
}
return self::$DB_Open;
}
public function qry($sql, $return_format = 0)
{
$query = mysql_query($sql, self::$DB_Conn) OR die(mysql_error());
switch ($return_format)
{
case 1:
$query = mysql_fetch_row($query);
return $query;
break;
case 2:
$query = mysql_fetch_array($query);
return $query;
break;
case 3:
$query = mysql_fetch_row($query);
$query = $query[0];
return $query;
default:
return $query;
}
}
}
?>
在查看代码后我有一个问题,这真的是一个单例(参见DB类和Open函数)吗?
静态属性如何使单例模式起作用?
答案 0 :(得分:1)
我明白你的意思,如果self::$DB_Open
存在,它会将它设置为null并且无论如何都会创建一个新的对象实例。
看起来你是对的,这似乎不是单身人士模式。
关于具有静态属性的单例模式。与对象范围中的实例变量不同,静态变量位于类范围中。
这意味着即使你多次创建一个对象,它每次仍然会对静态属性使用相同的值。这使得他们能够成为专柜,因此也是全球单身人士。
见下文:
Class A {
static int y=1;
int x=3;
}
$newA = new A();
$newB = new A();
$newC = new A();
以上创建了3个x实例。您可以在1个实例中进行更改,它只会在该1个实例中进行更改 但是只创建了一个y实例。所以1和3的变化都会改变。它们都存在于相同的上下文中。因此指向相同的值。如果你增加一个,其他人将显示相同的增量等。
因此,为了重新迭代,即使只存在DB_Conn
的单个实例,它也会不断地重置它并再次写入它(它不必像这样行事)。
要解决此问题,作者可以返回self::$DB_Open
属性(如果存在)。