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

时间:2017-03-28 18:38:17

标签: php

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

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();
}

当然这不是一条路,但我真的不知道什么是可行的方式。

我想也许这会奏效。但它并没有 在类中创建一个新的Database对象来构造连接

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 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;
  }

}

1 个答案:

答案 0 :(得分:1)

这是我正在为连接做的事情

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 .........

    }

如果你想要纯粹的OOP方式,请查看工厂方法,看看外观设计模式,以及你将如何实现这一目标。

这是我的方式(简单方式),但对于架构更好地看到不同的设计模式。 这里有一篇有用的文章link
Design Patterns with PHP-The right way link