2014-06-16 16 views
0

這可能不是一個真正的問題,但我想知道爲什麼這會起作用。說明:調用父:: _構造,兩個數據庫()類

代碼工作方式我在這裏發佈。

我有一個數據庫()類這樣的:

class Database extends PDO 
{ 

    public function __construct() 
    { 
     $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING); 
     parent::__construct(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8', DB_USER, DB_PASS, $options); 
    } 
} 

該類被通過控制器稱爲:

class Controller 
{ 
    function __construct() 
    { 
     Session::init(); 

     if (!isset($_SESSION['user_logged_in']) && isset($_COOKIE['rememberme'])) { 
      header('location: ' . URL . 'login/loginWithCookie'); 
     } 

     try { 
      $this->db = new Database(); 
     } catch (PDOException $e) { 
      die('Database connection could not be established.'); 
     } 

     $this->view = new View(); 
    } 
} 

通知數據庫()類被稱爲這裏。現在

,我有一個「模式」,這需要數據庫連接與數據庫進行通信:

class Notes extends Controller 
{  
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public static function getSumNotes() 
    { 
     $sql = "SELECT COUNT(*) FROM table WHERE user_id = :user_id"; 
     $query = new Database(); 
     $query = $query->prepare($sql); 
     $query->execute(array(':user_id' => $_SESSION['user_id'])); 

     return $query->fetchColumn(); 
    } 
} 

這讓我惱火的事情:方法註釋:getSumNotes()調用另一個新Database()類,它是從表中獲取我的值所必需的。沒有這個連接就無法工作。

問題:爲什麼我必須調用Database()類兩次,儘管Notes中的parent :: __ construct()從「dads」(Controller)類獲得了相同的變量和構造函數?

希望得到啓發。

謝謝。

+0

declare'protected $ db'然後在你的父類中使用'return $ this-> db;',在'notes'類中使用'private $ db'。 – Ohgodwhy

+0

您應該將全局數據庫連接傳遞給Controller類和它的子類;現在您爲您創建的每個對象打開一個數據庫連接。在對象本身中,您應該可以使用'$ this-> db' – jeroen

+0

@Ohgodwhy:無法正常工作。當我'var_dump()'或'print_r()'出'$ this-> db'時,什麼都不會發生。它顯示我的屏幕上沒有陣列。 – CRoemheld

回答

0

您不必兩次調用數據庫對象。
注意您的getSumNotes()方法是static,因此您將無法在方法內部調用$this(這會引發E_STRICT錯誤,因此請檢查您的日誌)。

移除您的方法static或使用此解決方法:

class Notes extends Controller 
{ 
    // Notice the new variable has to be static as well 
    public static $staticDb; 

    public function __construct() 
    { 
     parent::__construct(); 
     // Make sure the db variable exists in your parent class 
     self::$staticDb = $this ->db; 
    } 

    public static function getSumNotes() 
    { 
     $sql = "SELECT COUNT(*) FROM table WHERE user_id = :user_id"; 

     // Use the same DB connection 
     $query = self::$staticDb; 

     $query = $query->prepare($sql); 
     $query->execute(array(':user_id' => $_SESSION['user_id'])); 

     return $query->fetchColumn(); 
    } 
} 

在一個側面說明,你的MVC結構是有問題的。模型不應該是控制器類的擴展。
更多關於那here,如果你喜歡它。

+0

感謝您的解釋。不幸的是,結果與上述建議相同(var_dumped時我的屏幕上沒有數組)。 關於「模型」:這些都不是模型,這就是爲什麼我把它設置爲雙引號:) 我只是舉了一個例子,真正的代碼有點不同。但這是我的代碼現在正在使用的確切結構。 – CRoemheld

+0

@CRoemheld這段代碼有效,你絕對不應該實例化DB對象兩次。如果真實的代碼和你說的不一樣,那我就猜不出它有什麼問題。無論哪種方式,數據庫連接應該並可以傳遞給子類。 – LifeQuery

+0

我將完全相同的變量傳遞給我的腳本。我還向Controllers類傳遞了'protected $ db'。我也嘗試刪除「靜態」。結果與我說的相同:數組是空的。但我很感謝你的解釋! :) @LifeQuery – CRoemheld