php - 在 php.net 上找到的数据库适配器

标签 php mysql

我在 php.net 的 mysql-connect 页面上找到了一个数据库适配器。
这是一个浏览量很大的页面(我可以想象)。

它包括作者声称的单例模式类。

发现于 http://php.net/manual/en/function.mysql-connect.php

作者说:

"Here's a singleton class to manage a single Database connection. The Open method uses constant values as defautls, read from an ini file through an initializer script loaded at the top of each web page. You can also override the default values by manually entering your own (in case you need to switch servers or database names mid-script). The qry function takes a prepared statement and will return the first row, first associative row, first cell, or entire result set based on the second parameter (entire result if omitted)."

Usage: $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 函数)?

静态属性如何使单例模式起作用?

最佳答案

我明白你的意思了,如果 self::$DB_Open 确实存在,它会将它设置为 null 并创建一个对象的新实例。

看来你是对的,这看起来不像单例模式。

关于具有静态属性的单例模式。与对象作用域中的实例变量不同,静态变量在类作用域中。
这意味着即使您多次创建一个对象,它每次仍会为静态属性使用相同的值。这使得它们非常适合计数器,因此也适用于全局单例。

请看下面:

Class A {
static int y=1;
int x=3;
}
$newA = new A();
$newB = new A();
$newC = new A();

上面创建了 x 的 3 个实例。您可以在 1 个实例中进行更改,它只会在该 1 个实例中进行更改。
但是只创建了 1 个 y 实例。所以 1 的变化和所有 3 都会改变。它们都存在于相同的上下文中。因此指向相同的值。如果你增加一个,其他人将显示相同的增量等等。

所以要重申,即使只有一个 DB_Conn 实例确实存在,它也会不断地重置它并再次写入它(它不必像这样行事)。

为了解决这个问题,作者可以返回 self::$DB_Open 属性(如果它确实存在的话)。

关于php - 在 php.net 上找到的数据库适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14687140/

相关文章:

c++ - 如何发送查询以使用 Connector/C++ 填充 utf8 VARCHAR 列?

php - 在 php 邮件中自动附加文件

php - 如何使用 PHP 退回电子邮件

mysql - 将 3 个表中的数据收集到 1 个查询中

php - PHP 数据库 ID 列中的最后一个条目(主键)

mysql - F3 (Fat Free Framework) DB\Cursor->paginate 行为怪异

php - 如何将 CSS 字体样式添加到 PHP echos?

php - 将逗号分隔的 mysql 标签与数据库值相匹配 (WP - PHP)

php - 沙发基地 php windows 客户端

php - 使用正则表达式获取标签内的引​​号