2013-10-10 64 views
0

我目前正在使用OOP和PDO編寫我的第一個PHP應用程序。爲此,我正在研究一個連接類,以便在需要時啓動數據庫連接。我相信我做這件事的方式是依賴注入。PHP - PDO連接類 - 無法訪問

我當前嘗試訪問連接時發生錯誤。

這是我的連接類:

class db{ 

    private $host = ''; 
    private $dbname = ''; 
    private $username = ''; 
    private $password =''; 

    public $con = ''; 

    function __construct(){ 

     $this->connect(); 

    } 

    function connect(){ 

     try{ 

      $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password); 
      $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

     }catch(PDOException $e){ 

      echo 'We have a problem!'; 

     } 
    } 
} 

而且這是我正在試圖把它的其他類的內部。

private $con; 

    public function __construct(db $con) { 
     $this->con = $con; 
    } 

但是,這是我嘗試運行它時收到的錯誤。

Catchable fatal error: Argument 1 passed to users::__construct() must be an instance of db, none given. 

任何意見,我在做什麼不正確將非常感激。

+2

因此,您實際上無法從短語「必須是db的實例,沒有給出」理解什麼? – zerkms

回答

2

您需要首先創建數據庫實例,並把它傳遞給你的「其他」類

$db = new DB(); 
$class = new OtherClass($db); 

除此之外的構造,還有其他一些問題:

DB類的構造函數做不爲數據庫名稱,用戶和密碼等賦值。一種方法是將這些設置傳遞給DB的構造函數,並將這些值分配給私有屬性。

class DB{ 

    private $host = ''; 
    private $dbname = ''; 
    private $username = ''; 
    private $password =''; 

    public $con = ''; 

    function __construct($host, $dbname, $username, $password){ 

     $this->host = $host; 
     $this->dbname = $dbname; 
     $this->username = $username; 
     $this->password = $password; 
     $this->connect(); 

    } 

    function connect(){ 

     try{ 

      $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password); 
      $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

     }catch(PDOException $e){ 

      echo 'We have a problem!'; 

     } 
    } 
} 
+0

我刪除了這些值的目的是在這裏發佈:) 我已經添加了數據庫實例,但是我仍然收到相同的錯誤。 – user2865415

+0

該錯誤表示空值已過去作爲參數。你能否將代碼粘貼到'OtherClass'實例化的地方? – DavidLin

+0

我已更新到您更新的連接類。 我現在正在啓動該連接類下的其他類。使用 \t $ con = new DB; \t $ class = new users($ con); – user2865415