【问题标题】:DB Connection - Singleton. How to pass users data in it?数据库连接 - 单例。如何在其中传递用户数据?
【发布时间】:2023-03-13 03:28:02
【问题描述】:

尝试使用单例的数据库连接。 __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)。

请有任何想法。

【问题讨论】:

  • 避免使用单例模式slideshare.net/go_oh/…
  • @CodingInsane,如果使用得当,我真的不认为单例不好。如果您不希望为一个类创建多个对象(实例),我相信,没有比单例更好的选择了。就我而言,我需要限制 dbconnection 实例,因此您的评论无济于事。
  • 我不明白你为什么不直接使用Dependency Injection
  • @CodingInsane,依赖注入是个好主意,但根据我的预算和应用程序的性质,这将是“太多事情要做”。所以我正在尝试单身。但我总是对依赖注入印象深刻。

标签: php pdo parameters singleton


【解决方案1】:

您可以使用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();

我不推荐Singleton,我建议使用Dependency Injection

【讨论】:

    【解决方案2】:

    这是一个非常基本的问题。您将变量声明为受保护的,这意味着您只能在类中获取它们。这实际上非常好。要更改这些变量,您需要创建 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');
    

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

    【讨论】:

    • 在写到这里之前试过这个。但是由于 dbconnection 是在构造函数中进行的,所以它需要已经设置用户,同时调用 MyDbConn::returnInstance();所以在下一行设置用户没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2014-01-05
    • 2020-12-28
    • 2010-09-19
    相关资源
    最近更新 更多