2011-03-28 47 views
1

我用PHP編寫的一個非常簡單的數據庫類,支持最基本的東西,如連接/斷開連接,查詢,提取數據等正確使用PHP中的數據庫類?

我知道我在這裏重新發明輪子,但有一些學習方面在這之後。我已經測試過了,效果很好。現在我想利用這個類來運行一個網站,我知道在任何時候都有大量的同時在線的用戶,我發現自己對於如何使用這個類有點不確定。

每次我想要使用該類時,是否都創建一個新實例?可以說我有列出一些我在我的數據庫中的功能,請我做這樣的事情?:

function listStuff() { 
    $db = new Database(); 
    $db->connect(); 
    $result = $db->query($someQuery); 
    //do stuff with result 
    $db->dicsonnect(); 
} 

這似乎是在內存中創建對象的不必要的量,所以我會如何去做重用對象但是仍然能夠同時擁有用戶?

謝謝!

+1

避免自己創建東西。不要重新發明輪子。使用框架,zend,yii,sphmyfony – dynamic 2011-03-28 23:34:07

+0

@ yes123 **避免自己創建東西** xD他不應該創建它,如果他不知道他在做什麼。 Kohana FTW。 – 2011-03-28 23:59:43

回答

-1
global $db; 

Lorem存有悲坐阿梅德

function listStuff() { 
    global $db; 
    $result = $db->query($someQuery); 
    //do stuff with result 
} 
+0

'global $ db; $ db = new Database(); $ db-> connect(); function listStuff(){ $ result = $ db-> query($ someQuery); //完成結果 } $ db-> dicsonnect();' – PiZzL3 2011-03-28 23:32:49

+1

這不會導致同步問題嗎?比方說,一個用戶1正在做一個連接,然後執行一個查詢,但在連接和查詢之間user2正在做一個斷開連接。或者我錯過了什麼? – Slim 2011-03-28 23:33:01

+1

全局變量是邪惡的,不應該使用,尤其是在這種情況下 – xzyfer 2011-03-28 23:33:48

0

但是你不能在一個以上的用戶使用一個實例。但對於單個用戶,您可以通過將該對象的實例傳遞給稱爲註冊表的中央存儲庫來防止不必要的實例化。

0

嚴格來說,您不會爲多個用戶創建單個實例。每個構造數據庫對象的請求都會再次實例化它。

如果您主要使用數據庫檢索用戶信息,我會建議您編寫一個對象模型來表示您的用戶。這個數據庫以及數據庫類可以包含在全局範圍內,同時調用session_start()以允許您在一個類接口中管理用戶會話。當由數據庫管理的持久性被包裝在有意義的對象接口中時,對網站功能進行建模變得更加容易。

您可以編寫一個基本類,該類具有利用您的數據庫類並向其中提供查詢的方法。

class User{ 
    public function __construct($user_id){ 
    //use your database class to find a user id and assign properties of the user data 
    //Then save to the session. 
    $_SESSION['user'] = $this; 
    } 

    public static function Login($username, $pass){ 
    //use your database object to find the user id associated with the passed login creds, then construct it as a user using the above function; 
    } 


    public static function Logout(){ 
    //remove any user in the session and restart the session 
    } 
} 

這種基於模型的代碼往往是建立非常語義方法名是有用的,它可以爲全球的管理狀態,如在數據庫用戶屬性很有用。當你開始編寫包含連接性的抽象類併爲孩子可以繼承的數據構造時,它也派上用場。

我已經遇到了很多數據庫類,這些數據庫類在小型部署都是必需的時候被部署爲單例,並且對其任何查詢函數的調用都會創建訪問持久連接,然後在請求。

4

您應該是usingdependencyinjection。這將確保您的代碼不僅易於閱讀和測試,而且可以使您的函數(我希望在類中)可重用。

function listStuff(DatabaseClassInstance $db) 
{ 
    $result = $db->query($someQuery); 

    //do stuff with result 
} 

當腳本結束時,如果你使用的是庫MySQLi或PDO擴展的$db對象將被終止。

類型暗示DatabaseClassInstance不是必需的,但在這種情況下很好,以確保正確的參數類型被傳遞到函數中。

+3

+1作爲依賴注入是最好的方式,而不是使用全局。 另外,@Slim你不是真的重新發明輪子。在我的工作中,我們還使用處理主/從連接的DB類以及輔助函數,如按第一行查詢,按ID查詢以及標準查詢對象和數組等。 使用預先存在的框架確實可行,但你需要知道你在做什麼,而且大多數時候你還需要大量的包才能使用他們的數據庫類,這會增加比你想要或者需要的更多的開銷。 – 2011-03-29 00:36:41