2015-01-10 41 views
0

我遵循MVC OOP結構,我想知道一個體面的數據庫類將如何。數據庫類的目的是爲了讓其他類調用它的方法或擴展它。數據庫類連接到我的其他類

這是我現在connection.php看起來如何

<?php 

$db = new mysqli('localhost', 'root', '', 'audiologiska_kliniken'); 

if($db->connect_errno > 0){ 
    die('Ett fel inträffade [' . $db->connect_error . ']'); 
} 

這是一個數據庫類,我開始。

<?php 
include 'C:/wamp/www/mvc/include/connect.php'; 
class Database 
{ 
    private $host; 
    private $user; 
    private $password; 
    private $database; 
    function __construct{ 
     // if(file_exists($filename)) {include '';} 
     //else throw new exception("Error!"); 

     $this->host=$host; 
     $this->user=$user; 
     $this->password=$password; 
     $this->database=$database; 

     $this->connect(); 
    } 
    private function connect() 
    {//Connect to the server 
     if(!mysqli_connect($this->host, $this->user, $this->password, $this->database)) 

它看起來不好我知道,但我真的不知道如何進一步改善它。我希望你們提出一些建議

+0

_數據庫類的目的是讓其他類調用它的方法或擴展它 - 這不是一個很好的目的。本地的'MySQLi'對象已經完成了所有這些。我確信這不是你想要的目的,但是如果你不清楚,我們很難提供幫助。 – Halcyon

+0

我建議你爲你的包含使用相對路徑。您將這款產品投入生產的那一天,它將爲您節省一些頭痛! – Philibobby

+0

@Philibobby考慮自動加載。你永遠不會再寫一個include語句。 – Halcyon

回答

0

正如Halcyon所提到的,使用名稱空間,作曲家或自己的spl_autoload函數來查看自動加載。

您應該對其他設計模式進行一些調查。

單例模式常用於防止每個請求/響應週期加載多個數據庫連接。

這樣,每次你需要你的數據庫連接時,你可以不喜歡

$db = DB::getInstance(); 

如果沒有先前創建的類,或現有連接這將返回您連接的新實例。

它也可能是一個好主意,停止該實例的人被克隆,通過實現__cloned魔術方法,像這樣:但是

public function __clone() { 
    throw new Exception("Can't clone a singleton"); 
} 

人認爲單身是不好的,因爲它們引入了全局狀態和緊耦合到應用程序中。這使他們很難測試。另一種方法是查看可能使用的服務,這是應用程序中的全局內容。

http://fabien.potencier.org/article/11/what-is-dependency-injection Symfony有一個使用服務和依賴注入容器的好方法。

Laravel在IoC容器中也有一個很好的依賴注入容器的例子。它是一個管理班級分辨率的班級。該框架調用其服務ServiceProviders。

像這樣工作有很多優點,例如測試的簡易性和應用程序中對象間的鬆散耦合。

https://github.com/illuminate/database特別是Connection.php和ConnectionResolver.php是一種實現數據庫連接的方式。 Connection.php表示實際連接,每次都使用工廠模式創建,並且ConnectionResolver足夠聰明以處理多個連接。靈感:)