2013-12-22 31 views
0

如何在一個類中使用子類?我嘗試使用擴展,但我不認爲這是我正在尋找。正在使用PHP的子類

class Database 
{ 
    protected $link; 
    private $host, $database, $username, $password; 

    public function __construct($host, $database, $username, $password) 
    { 
     $this->host = $host; 
     $this->database = $database; 
     $this->username = $username; 
     $this->password = $password; 
     $this->connect(); 
    } 

    private function connect() 
    { 
     $this->link = new mysqli($this->host, $this->username, $this->password, $this->database); 

     //GLOBAL $this->link 

     if ($this->link->connect_errno) 
      die('Connection Error: ' . $this->link->connect_errno); 
    } 

    public function __sleep() 
    { 
     return array('host', 'database', 'username', 'password'); 
    } 

    public function __wakeup() 
    { 
     $this->connect(); 
    } 
} 

class Users extends Database{ 
    public function getAll(){ 
     $stmt = Database->link->prepare('SELECT id, username, email FROM USERS'); 
     $stmt->execute(); 
     $stmt->bind_result($id, $username, $email); 
     while($stmt->fetch()) 
      $row[] = array('id' => $id, 'username' => $username, 'email' => $email); 
     $stmt->close(); 
     return $row; 
    } 
} 
在顯示內容的文件

則...

$db = new Database(HOST, DATABASE, USER, PASSWORD); 
$users = $db->Users->getAll(); 
foreach($users as $user){ 
    echo $user['username'] . "<br />"; 
} 

我覺得我的問題是與$stmt = Database->link->prepare$users = $db->Users->getAll();

我更是C的傢伙,因此PHP方法還挺有我。有人能準確地描述我需要做什麼來獲得正確的子類操作嗎?

+0

這對我來說不是很清楚。你的意思是實際的繼承類(在這種情況下'extends'是你想要的)還是一個內部類(class-a-class)?我不知道內部類。 – maackle

+0

嗯,我可以這樣做:Users :: getAll(); ?我只是試圖從數據庫中獲取所有用戶,並且這些信息位於數據庫類中。對不起,如果這很難理解我想要的。 – MysteryDev

回答

2

我覺得我的問題是與$stmt = Database->link->prepare$users = $db->Users->getAll()

你說對了。

由於Users延伸Database,它可以訪問保護財產$link,因此,您只需通過$this使用它,例如

$stmt = $this->link->prepare(...) 

現在,你真的不希望被創建一個新的每次你實例化一個Database類或它的一個後代時MySQL連接。相反,您應該將mysqli依賴項傳遞給構造函數,例如

abstract class Database { 
    protected $link; 

    public function __construct(mysqli $link) { 
     $this->link = $link; 
    } 
} 

class Users extends Database { 
    public function getAll() { 
     $stmt = $this->link->prepare(...); 
     // and so on 
    } 
} 

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); 
$usersDao = new Users($mysqli); 
$users = $usersDao->getAll(); 
foreach($users as $user){ 
    echo $user['username'] . "<br />"; 
} 
+0

感謝您更深入的理解。也許這不是我想要的。我想要像用戶這樣的類,但是我不想每次創建新的類數據庫時都會調用用戶或類別等其他類。這只是要求內存泄漏。 – MysteryDev

+1

@ Jakes625您並未每次創建新的'Database'類。事實上,在我的答案中,它們是抽象的,不能直接創建。然而,你需要創建一個'Users'或者'Categories'類來使用它們。 – Phil

+0

嗯,也許我可以在數據庫中創建一個類變量,然後用作$ db - > $ users-> getAll();其中$ users是數據庫中的一個var,具有類Users的新實例。 – MysteryDev