Php 如何在OOP类中调用数据库连接函数?

Php 如何在OOP类中调用数据库连接函数?,php,Php,我希望能够调用连接到数据库的函数,而无需创建多个对象,包括或必须在每个类中编写相同的构造。我基本上想在其他类中调用构造函数。 像下面这样 class Database{ public function __construct(){ $this->conn = new mysqli("host", "user", "password", "db"); // Check connection if (!$this->conn) { d

我希望能够调用连接到数据库的函数,而无需创建多个对象,包括或必须在每个类中编写相同的构造。我基本上想在其他类中调用构造函数。 像下面这样

class Database{

  public function __construct(){
    $this->conn = new mysqli("host", "user", "password", "db");

    //  Check   connection
    if  (!$this->conn)  {
      die("Connection   failed: ".mysqli_connect_error());
    }
  }
}

class User{
// call Database->__construct();

}

class OtherClass{
// call Database->__construct();
}
当然,这不是一个可行的办法,但我真的不知道什么是可行的办法

我想也许这会管用。但事实并非如此 在类中创建新数据库对象以构造连接

class Database{

  public function __construct(){
    $this->conn = new mysqli("host", "user", "password", "db");

    //  Check   connection
    if  (!$this->conn) {
      die("Connection   failed: ".mysqli_connect_error());
    }
  }
}

class User{
  $conn = new Database();
}
class DBConnection{
    protected static $db;
    private function __construct() {
        try {
            self::$db = new PDO( 'mysql:host=localhost;dbname=db_abc', 'root', '' );
            //self::$db = new PDO( 'mysql:host=localhost;dbname=db_phonebook', 'root', 'QAZwsx2016!' );
            self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        }
        catch (PDOException $e) {
            echo "Connection Error: " . $e->getMessage();
        }
    }
    public static function getInstance() {
        if (!self::$db) {
            new DBConnection();
        }
        return self::$db;
    }

    public function __destruct() {
        $db=NULL;
    }
}
依赖注入或构造函数注入似乎是一个很好的解决方案。但我不知道它是否是为这样的东西,以及如何应用它

class Database{

  public function connection(){
    $this->conn = new mysqli("host", "user", "password", "db");

    //  Check   connection
    if  (!$this->conn) {
      die("Connection   failed: ".mysqli_connect_error());
    }
  }
}

class User{

  private $db;
  public function __construct(Database $conn){
    $this->db = $conn;
  }

}

这是我为连接所做的

class Database{

  public function __construct(){
    $this->conn = new mysqli("host", "user", "password", "db");

    //  Check   connection
    if  (!$this->conn) {
      die("Connection   failed: ".mysqli_connect_error());
    }
  }
}

class User{
  $conn = new Database();
}
class DBConnection{
    protected static $db;
    private function __construct() {
        try {
            self::$db = new PDO( 'mysql:host=localhost;dbname=db_abc', 'root', '' );
            //self::$db = new PDO( 'mysql:host=localhost;dbname=db_phonebook', 'root', 'QAZwsx2016!' );
            self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        }
        catch (PDOException $e) {
            echo "Connection Error: " . $e->getMessage();
        }
    }
    public static function getInstance() {
        if (!self::$db) {
            new DBConnection();
        }
        return self::$db;
    }

    public function __destruct() {
        $db=NULL;
    }
}
这是我如何使用另一个模型类的

class User{
    private $db;
    public function __construct() {
        $this->db = DBConnection::getInstance();
    }
    public function getUsers(){
        //....................
        //....................
        //$sql = 
        $query = $this->db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
        $query->execute();
        $customers = $query->fetchAll();
        //return .........

    }
如果你想要纯面向对象的方式,请看看工厂方法,看看门面设计模式,这一切都是关于你如何实现这一点

这是我的方法(简单的方法),但是为了更好地了解不同的设计模式。 这里有一篇有用的文章 及

创建singleton类以建立连接,然后在任何地方使用该类。定义为静态,这样就不需要实例化。如果需要,我可以发布一个singleton类的示例来建立db连接though@webDev我真的很感激你,我真的不知道你说的单身班是什么意思。看看这个例子:你必须花时间去理解它。一个简单的替代方法是,在PHP脚本开始时初始化一个全局范围的变量
$database
,其中包含数据库连接,然后在任何地方都使用它。为什么不呢?非常好。通过将$db设置为静态,一次只能使用一个数据库连接,对吗?通过定义多个连接单例类并将其包含在模型类中,可以拥有多个数据库连接。示例仅显示一个连接类。更新该类并创建另一个类。