2017-03-28 8 views
1

複数のオブジェクトを作成せずに、自分のデータベースに接続する関数を呼び出せるようにしたいと思います。私は基本的に他のクラスの構築関数を呼びたいと思っています。 のようになります。このofcourseのクラスOOPでデータベース接続関数を呼び出す方法は?

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

Dependecy注射またはコンストラクタインジェクションを構築するために、クラスに新しいデータベースオブジェクトを作成しない素敵な解決策のように思えます。しかし、私はそれがこのような何かのために作られているかどうか、それを適用する方法を知りません。私は別のモデルクラス

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の方法をしたい場合に使用していますどのように私は

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

} 
+0

接続を確立して、どこにでもクラスを使用するシングルトンクラスを作成します。あなたはインスタンス化する必要はありませんので、静的として定義します。 – webDev

+0

@webDevが本当に感謝していますが、シングルトンクラスのサンプルを投稿してdb接続を確立することはできますが、シングルトンクラスで何を意味するのか分かりません。そしてあなたはそれをどのように呼ぶでしょう。 – Jelbow

+0

この例を見てください:https://sourcemaking.com/design_patterns/singleton/php/1あなたはそれを理解する時間が必要です。簡単な方法は、PHPスクリプトの開始時にデータベーススコープの変数$ databaseをデータベース接続で初期化し、それをすべての場所で使います。何故なの?非常にうまく動作します。 –

答えて

1

、工場に見てください。方法、およびファサードのデザインパターンを見て、そのすべての方法については、これを達成するつもりです。

これは私の方法です(簡単な方法です)が、アーキテクチャにはさまざまなデザインパターンがよく見えます。ここ 一つの有用な記事link
Design Patterns with PHP-The right waylink

+0

私は今これを試してみるつもりです。 – Jelbow

+0

$ db静的にすることで、一度に1つのデータベース接続でしか機能しませんか? – Exit

+0

接続用に複数のシングルトンクラスを定義し、モデルクラスにインクルードすることで、複数のデータベース接続を行うことができます。例では1つの接続クラスのみを示しています。そのクラスを更新し、別のクラスを作成します。 – webDev

関連する問題