2015-07-05 144 views
0

我一直在玩一些PHP類,只是試圖學習,但這個有我抓我的頭,經過大量的搜索和谷歌我似乎無法找到任何涵蓋這個問題(也許我不正確的說法搜索)。之前的配置類使用自己的pdo連接,所以我期待確保它不會每次打開一個新的連接,還有另一個類沒有在這裏顯示,但以相同的方式完成,這似乎工作。以下是錯誤:在另一個類中調用db類

Call to a member function query() on a non-object in config.class.php on line 15

唯一的區別我可以看到,可能會導致該是配置類運行結構中的查詢,其中作爲我的其他類不,這是一個問題,如果是的話,爲什麼?

已經嘗試了幾個不同的東西,但說實話,我只是不明白..只有從在線資源學習PHP。任何有關這方面的閱讀材料也將不勝感激。

一直用這個DB類: https://github.com/indieteq/PHP-MySQL-PDO-Database-Class

class Config 
{ 
    public $db; 
    private $config; 

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

     $this->config = array(); 

     $rows = $this->db->query("SELECT * FROM config"); 

     foreach($rows as $row) { 
      $this->config[$row['setting']] = $row['value']; 
     } 
    } 

    public function __get($setting) 
    { 
     return $this->config[$setting]; 
    } 

    public function __set($setting, $value) 
    { 
     $update = $this->db->query("UPDATE config SET value = :value WHERE setting = :setting", array("value"=>$value,"setting"=>$setting)); 

     if($update > 0) { 
      $this->config[$setting] = $value; 

      return true; 
     } else { 
      return false; 
     } 
    } 
} 

的所有類都要求一個文件:

require(INCLUDE_PATH . "Db.class.php"); 

include(INCLUDE_PATH . "languages\\en.php"); 
include(INCLUDE_PATH . "config.class.php"); 

$db = new Db(); 
$config = new Config(); 
+2

不要使用'全局變量$ db',因爲它可能給你造成一個範圍問題。相反,將'$ db'變量傳遞給'Config :: __ construct()'。在構造函數中添加一個參數並使用'$ config = new Config($ db);'(稱爲「依賴注入」)在此之前,在調用'new Db()'之後執行'var_dump($ db)以確保該對象已創建。 –

+0

@MichaelBerkowski感謝這個作品的完美!,我給了你一個投票:) – Izion

回答

2

試試這個:

$this->db = new Db(); 

或者給DB在放慢參數

public function __construct($db) ... 

然後:

$config = new Config($db); 
+0

我認爲目前的方法是有意地完成,以避免創建多個連接,因爲每次調用new Db()時都會這樣做 –

+0

對於數據庫是好的做法創建像單身人士Db類 – Daniel

+0

@丹尼爾感謝您的幫助,似乎現在按計劃工作。邁克爾在你之前就到了那裏,但是想知道在編輯時你也接受幫助別人的答案是正確的嗎? – Izion