2015-01-17 116 views
1

類下面是我當前的代碼PHP OOP的使用擴展了功能

class Database { 
    //Connect to database here... 
} 

class User extends Database { 

    public function GetUInfo($id) { 
     $db = new Database; 
     $db->query("SELECT `id` FROM `users` WHERE `id`=:id"); 
     $db->bind(":id", $id); 
     return $db->single(); 
    } 

    public function uptime($id) { 
     $db = new Database; 
     $db->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $db->bind(":id", $id); 
     return $db->execute(); 
    } 

} 

User類,我怎樣才能讓這個$db = new Database;是不是不必添加$db = new Database;在所有的公共職能做好準備,每個功能?

+0

我們可以顯示數據庫代碼類嗎?因爲你已經從數據庫擴展用戶類 –

+0

@AnandPatel - 所以SO不會讓我顯示它,因爲它相當大,它會使帖子多數代碼。 – BryanLavinParmenter

回答

2

由於您已將Database Class擴展爲User,因此您正在創建對象? 您可以直接訪問數據庫類的功能(公共和受保護的)

您可以使用$this關鍵字直接訪問它。

只有你必須在構造函數(父類)和子類中建立連接,你必須調用父類的構造函數。

<?php 
class Database 
{ 
    protected $db; 

    public function __construct() 
    { 
     //your connection code 
    } 
} 

class User extends Database 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function GetUInfo($id) 
    { 
     $this->query("SELECT `id` FROM `users` WHERE `id`=:id"); 
     $this->bind(":id", $id); 
     return $this->single(); 
    } 

    public function uptime($id) 
    { 
     $this->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $this->bind(":id", $id); 
     return $this->execute(); 
    } 
} 

?> 
+0

如果你想單元測試這種類型的代碼,你堅持使用你的數據庫。恕我直言,最好是推動用戶類內的數據庫依賴。不說你的方法這是一個壞事*本身*,只要記住:-) – mTorres

+0

,因爲他已經擴展數據庫類到用戶這就是爲什麼;)否則我不會發布這個答案 –

+0

好點,夠公平: - ) – mTorres

2

創建一個構造函數和私有財產$db

private $db; 

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

所以你可以使用它像這樣

public function uptime($id) { 
     $this->db->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $this->db->bind(":id", $id); 
     return $this->db->execute(); 
    } 

由於文件檔案化mTorres它能夠更好地做這樣的

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

如果您對OOP來說是新的 - read this article它可能有幫助。

+0

這有效,但我不知道是否有一個更容易的選項,以避免使用$ this-> db。這很好,但它可以很好地使用$ db-> – BryanLavinParmenter

+2

是的,但是你可以使依賴顯式化並注入它,而不是直接創建一個新的對象:'''public __construct(DatabaseType $ db) {$ this-> db = $ db; }''' – mTorres

+0

@mTorres完全贊同你 –