2011-04-28 112 views
3

我有一個名爲「用戶」,用於保存用戶信息的表。我會打電話給我的用戶類並創建一個用戶對象,以便我可以抓取該用戶需要的任何信息。什麼是DB對象交互的其他PHP類設計?

我已經使用下面的類和它們的雜交已經爲我的網站,但一直沒有真正高興與他們主要是因爲我不確定其他開發商如何處理這種情況,如果有更好的解決方案。以下是我一直在使用的一些方法,我很好奇看看其他開發人員在做什麼。

思想#1

class User 
{ 
    //public user 

    public function __construct() 
    { 
      //get user - queries table and returns all fields in array 

    } 

    //get name function - references user array and returns name 
    //set name function - sets new name in array 

    //commit function - commits array to db (saves changes) 
} 

思想#2

class User 
    { 
     //user id 

     public function __construct(user id) 
     { 
       //set user id 

     } 

     //get name function - calls db directly and returns name 
     //set name function - calls db directly and sets name 

     //commit function - commits array to db saves changes 
    } 

思想#1似乎是DB的呼叫的最有效的,或最少量的但稍微更復雜,比思想不太直接#2。

我喜歡的想法#2更好,但我害怕它的可擴展性,因爲每個功能使得對DB的調用。

思考

+2

看看活動記錄設計模式:http://en.wikipedia.org/wiki/Active_record_pattern – 2011-04-28 18:08:38

回答

-1

我會建議你使用PHP框架狀的Yii。

http://www.yiiframework.com/

它有不錯的功能類和數據庫之間的交互。 如果你真的想自己做,你也可以在那裏獲得靈感。

0

首先用戶對象是指保持用戶數據,所以我建議方法#1,#方法2更該發送的命令來獲取數據的AMODEL對象的。

現在,你可以自動用戶排在1個單查詢映射到一個對象,例如:

class User 
{ 
    //Predefine Here 
    public $id; 
    public $username; 
    public $password; 
    public $email; 
    public $hash; 

    public function profileLink() 
    { 
     return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username); 
    } 
} 

//Fetch the results 

$result = $sth->fetchAll(PDO::FETCH_CLASS, "User"); 
$userObjects = array(); 
foreach($result as $user) 
{ 
    $userObjects[] = $user; 
} 

//Now you can use like so: 

echo $userObjects[2]->profileLink(); 

所以我其他的答案在這裏:PDO PHP Fetch Class

1

什麼是這樣的:

class Db 
{ 
    function __construct() 
    { 
     $this->engine = DB_ENGINE; 
     $this->dbname = DB_NAME; 
     $this->host = DB_HOST; 
     $this->username = DB_USERNAME; 
     $this->password = DB_PASSWORD; 

     $this->connect(); 
    } 

    function connect() 
    { 
     $this->db = new PDO($this->engine.':host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password); 
    } 
} 

class Table extends Db 
{ 
    protected $from = null; 

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

    function select($columns, $where, $order, $offset, $limit) 
    { 
    } 

    function update($where, $data) 
    { 
    } 

    function delete($where) 
    { 
    } 

    etc... 

} 

class User extends Table 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->from = 'blog'; 
    } 

    function get_user() 
    { 
     $this->select(params); 
    } 

    function get_user_count() 
    { 
    } 

    etc... 
} 

這樣你就可以輕鬆地使用它來獲取其他信息也僅僅是創建一個新類與它的功能來檢索/刪除/等的信息。

+0

我真的很喜歡的想法有一個包含方法更新,選擇和刪除的Table類。這是有道理的,因爲你可以將它們包含在任何對象類中。 – payling 2011-04-28 18:56:58

+1

也許這只是我......但**用戶**不是**表**的形式,既不是** DB **的形式。這沒有意義。 – 2011-04-28 19:13:16

+0

@teresko - 當你說「不是表格」時,你是什麼意思? – payling 2011-04-28 19:30:07

0

我認爲,如果你要實現自己的用戶類,那麼它應該類似於下面的內容:

class User { 
    private $UserID; 
    private $Username; 
    private $AvatarImg; 
    // ... First Name, Last Name, ALL other user information that you store in the DB. 

    function __construct($uid) { 
     // Populate all private members from the DB for the given user id. 
    } 

    function update($assocArrayOfValues) { 
     // Commit these values to the Db and Update the private members. 
    } 

    // All Associated get functions (getName, getUID, getUsername etc) 
    // Any other specialty functions you may want, e.g... 
    function getAvatar() { 
     return "<img src = '" . $this->AvatarImg . "'/>"; 
    } 

} 
0

你正在嘗試歸檔是一個ORM的功能(對象 - 關係映射器)。使用它可能是有益的,而不是你自己做的。

如果你想這樣做你自己,我會去的延遲加載。這是你兩個想法之間的一點點。在PHP中,它看起來是這樣的:

class User 
{ 
    private $id; // depends on your application, could also be a string 
    private $dirty; 
    private $loaded; 

    private $properties; 

    public function __construct($user_id) 
    { 
     $this->id = $user_id; 
    } 

    public function __destruct() 
    { 
     if ($this->dirty) { 
      // commit to DB 
     } 
    } 

    public function __get($name) 
    { 
     if (!$loaded) 
     { 
      $this->loadFromDb(); 
     } 
     // error-handling if the key does not exist is missing here! 
     return $this->properties[$name]; 
    } 

    public function __set($name, $value) 
    { 
     // May be required to load the data here... 

     // error-handling if the key does not exist is missing here! 
     $properties[$name] = $value; 
     $this->dirty = true; 
    } 

    private function loadFromDb() 
    { 
     // query data from db and store it in properties 
    } 
} 

這種設計的好處是,如果你構造對象,最終你不需要,沒有什麼感動的數據庫呢。還要注意解構過程中所做的提交。

如果您有時加載集合,那麼在創建對象時,讓函數從DB加載一堆行並將行作爲參數傳遞給構造函數可能會很有用。如果你自己構造了每個對象,這將只需要一個查詢而不是可能的數百個查詢。

作爲進一步的增強功能,您可以提供一個User::reset()函數,它可以拋棄所有更改。

2

我會爲您推薦瞭解DataMapper模式。基本思路是這樣的:

可以說(爲了舉例),您有一個處理書籍的應用程序的MVC結構。

  • 這將是有意義的有一個模型Library負責與管理不同的書籍的域​​邏輯。
  • 該模型處理未知數量Book實例(圖書館中的很多書籍)。
    每本書
    • 知道一切關於它自身(作者,出版日期,語言..等)
    • 沒有知道它在哪兒存儲或者數據來自
    • 可以與在數據庫中的表,而是包含多個表
  • 然後,你還要BookMapper類的實例,其信息
    • 模型在構造接收(實現預定義的接口)
    • 知道如何(和在哪裏)存儲Book對象,以及如何將數據讀入它們
    • 可以切換到一個不同的對象,如果存儲介質改變
    • 如果它與數據庫作品,那麼它在構造函數中已要求一個DB對象(比如PDO)
    • 具有從存儲
    • 節省本書的數據,或獲得新的信息的方法 store(Book $book)

這是我怎麼會做..

+0

PeeHaa的想法與Data Mapper(如果不是相同的)類似,只是PeeHaa調用BookMapper類表。我非常喜歡這個概念。有一個數據映射器可以幫助分離數據庫層。 – payling 2011-04-28 19:19:13

+0

我從來沒有說** **任何**延伸** anyhting其他**。 – 2011-04-28 19:23:44

相關問題