使用单例类在php中建立数据库连接


Establishing database connection in php using singleton class

有没有人可以用一个示例代码来指导我在php中使用单例类建立数据库连接

class DatabaseSingleton
{
  // [Singleton]
  private static $instance = null;
  public static function getInstance()
  {
    if (!self::$instance)
    {
      self::$instance = new self();
    }
    return self::$instance;
  }
  private function __clone(){}
  // [/Singleton]
  private $connection = null;
  private function __construct()
  {
    $this->connection = mysql_connect('localhost','root','admin');
    if ($this->connection)
    {
      mysql_select_db('my_database');
    }
  }
  //
  // crud operations go here.
  //
}
$db = DatabaseSingleton::getInstance();
$db->SomeCRUDOperation();

也许是这样的?非常基础,但应该给你一个起点。

这就是单例模式的样子:

 <?php
 class SingletonClass
 {
     static private $instance = null;
 static public function getInstance()
 {
     if (null === self::$instance) {
         self::$instance = new self;
     }
     return self::$instance;
 }
 private function __construct(){}
 private function __clone(){}

}
$singletonClass = SingletonClass::getInstance();

现在你可以在里面放入随机函数和参数来处理db的东西。我希望这能回答你的问题。

关于如何实现单例模式的示例,请参阅手册:http://www.php.net/manual/en/language.oop5.patterns.php

然后在类构造函数中建立数据库连接。

我使用这样的代码:

  class DBConn
    {
        static private $_db = null; // The same PDO will persist from one call to the next
        private function __construct() {} // disallow calling the class via new DBConn
        private function __clone() {} // disallow cloning the class
        /**
         * Establishes a PDO connection if one doesn't exist,
         * or simply returns the already existing connection.
         * @return PDO A working PDO connection
         */
        static public function getConnection()
        {
            if (self::$_db == null) { // No PDO exists yet, so make one and send it back.
                try {
                    self::$_db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS);
                } catch (PDOException $e) {
                    // Use next line for debugging only, remove or comment out before going live.
                    // echo 'PDO says: ' . $e->getMessage() . '<br />';
                    // This is all the end user should see if the connection fails.
                    die('<h1>Sorry. The Database connection is temporarily unavailable.</h1>');
                } // end PDO connection try/catch
                return self::$_db;
            } else { // There is already a PDO, so just send it back.
                return self::$_db;
            } // end PDO exists if/else
        } // end function getConnection
    } // end class DBConn

    /**
     * And you can use it as such in a class
     * */
     class Post {
        public function __construct(){
             $this->db = DBConn::getConnection();
        }
        public function getPosts()
        {
            try {
                /*** The SQL SELECT statement ***/
                $sql = "SELECT * FROM posts";
                foreach ($this->_dbh->query($sql) as $row) {
                    var_dump($row);
                }
                /*** close the database connection ***/
                $this->_dbh = null;
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
        }
    }

我使用下面的内容

class Database 
{   
 private $_connection;
    private static $_instance; //The single instance
    private $_host = "HOST";
    private $_username = "USERNAME";
    private $_password = "PASSWORd";
    private $_database = "DATABASE";

    public static function getInstance() {
        if(!self::$_instance) { // If no instance then make one
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    private function __construct() {
        $this->_connection = new mysqli($this->_host, $this->_username, 
            $this->_password, $this->_database);
        // Error handling
        if(mysqli_connect_error()) {
            trigger_error("Failed to conencto to MySQL: " . mysqli_connect_error(),
                 E_USER_ERROR);
        }
    }
    // Magic method clone is for prevent duplication of connection
    private function __clone() { }
    public function getConnection() {
        return $this->_connection;
    }
}

$db = Database::getInstance();
$mysqli = $db->getConnection();
$sql_query = "SELECT foo FROM  etc";
$result = $mysqli->query($sql_query);