数据库连接 - 单一实例.如何在其中传递用户数据


DB Connection - Singleton. How to pass users data in it?

正在尝试将数据库连接与单例一起使用。 __constructor一直是私有的,并从静态函数返回实例。

class MyDbConn 
{
    protected $_conn;
    protected $database;
    protected $user;
    protected $password;
    protected $host = "localhost";
         private static $instance;
         private function __construct()
         {
              $this->db_conn = new PDO("mysql:host=$this->host;dbname=$this->database",$this->user,$this->password);
              $this->db_conn->exec("set names utf8");
              $this->_conn = $this->db_conn;
         }
         public static function returnInstance() {
              if(self::$instance == null)
              {
                  print "Object  created!";
                  self::$instance = new self;
              }
               return self::$instance;
          }
           public function returnconnection(){
            return $this->_connection;
          }
     } 

现在我可以从 MyDbConn::returnInstance()->returnconnection();

但如何将我的用户详细信息和数据库名称传递给此构造函数?我不能做 ::returnInstance($username,$password) 或 returnconnection($username,$password)。

请有任何想法。

您可以使用global或普通函数调用来完成此操作

<?php
class MyDbConn 
{
    protected $_conn;
    protected $database;
    protected $user;
    protected $password;
    protected $host = "localhost";
    private static $instance;
    private function __construct()
    {
    }
    public static function returnInstance() {
         if(self::$instance == null)
         {
             print "Object  created!";
             self::$instance = new self;
         }
          return self::$instance;
     }
     private static function initDatabase(){
         $database = self::returnInstance();
         global $config;
         $database->_conn = new PDO("mysql:host={$config['host']};dbname={$config['database']}",$config['user'],$config['password']);
         $database->_conn->exec("set names utf8");
         return $database;
     }
      public static function returnconnection(){
       try {
           $db = self::initDatabase();
           return $db->_conn;
        } catch (Exception $ex) {
           echo "Error Establishing Database Connection " . $ex->getMessage();
           return null;
        }
      }
}

并像这样传递数据

// will be called from initDatabase using global keyword
$config = array('host' => 'localhost', 'database' => 'db name','user' => 'user here','password' => '');
$db = MyDbConn::returnconnection();

我不推荐单例,我建议使用依赖注入

这是一个

非常基本的问题。您将变量声明为受保护,这意味着您只能在类中获取它们。这其实很好。要更改这些变量,您需要创建 get 和 set 方法,例如更改$user编写方法:

public function setUser($user)
{
   $this->user = $user
}
public function getUser()
{
   return $this->user;
}
//Then you need get your object via
$db = MyDbConn::returnInstance();
//set user
$db->setUser('john');

仅此而已。此外,单例被称为反模式,因为它很难测试,而且它与全局变量非常相似,这并不好。