2014-11-21 104 views
1
function __construct($name, $lastName, $address, $rollNo) 
    { 
      $this->name = $name; 
      $this->lastName = $lastName; 
      $this->address = $address; 
      $this->rollNo = $rollNo; 

      $this->conn = new \PDO('mysql:host=localhost;dbname=students', 'root', ''); 
    } 

    public function getUser($id){ 
     $sql = "SELECT * FROM students WHERE id = ".intval($id); 

     foreach($this->conn->query($sql) as $row){ 
      $user['name'] = $row['name']; 
      $user['address'] = $row['address']; 
      $user['roll_no'] = $row['roll_no']; 
     } 
     return $user; 

    } 

創造新的PDO那麼什麼,我努力學習是我怎麼能在我的所有類使用一個PDO對象,而不是像用戶,課程等避免在每類

所有類創建$康恩

我遇到了依賴注入,單身人士,工廠和我作爲初學者這些都混在一起的話。

另外我想知道這是一個不好的做法,我在做我的代碼創建PDO的新對象。

+0

(+1)您的問題是有效的。那些與他人共事的人,被稱爲「最佳編程實踐」,是更好地完成一個程序的方法,但我完全同意,這些方法很難理解和使用。 – umlcat 2014-11-21 18:11:17

+1

[Design Patterns:如何僅在需要時創建數據庫對象/連接?]的可能的重複?(http://stackoverflow.com/questions/16472924/design-patterns-how-to-create-database-object-connection-only - 當需要) – Jimbo 2014-11-28 13:54:59

回答

2

singleton是一個控制類,它將確保一次只存在給定對象的一個​​實例。因此,不要在每個對象中調用$conn = new PDO(),而是創建PDO()的多個實例,您可以編寫一個名爲Database的單例類,並使用$conn = Database::instance()代替。

class Database 
{ 
    static $instance = null; 
    static function instance() 
    { 
     if (self::$instance == null) 
      self::$instance = new PDO('mysql:host=localhost;dbname=students', 'root', ''); 
     return self::$instance; 
    } 
} 

基本上它是創建一個PDO()類,如果它不存在,並重新使用它,如果它已經被實例化之前。

作爲一個優勢,您也不需要將數據庫憑據傳播到整個項目中。類Database將擁有它,並沒有其他人。

+0

這是一個解決方案。但是我記得我已經在某些地方讀過我們應該在這些類型的案例中使用依賴注入而不是singelton。我實際上並不知道依賴注入,而Singleton對我的場景來說是完美的。但想知道你的意見 – 2014-11-21 21:18:00

+0

@RaheelKhan這將是一個類,你可以創建一個實例,這個類的行爲就像'PDO'類,但它實際上是一個「中間人」,提供間接接口與使用單例方法實例化的實際'PDO'類。它使用'__call()'等PHP魔術方法來進行編程,但是對於這種特殊情況,它只會是一團糟。只有在改進原始類的功能時纔有意義,例如:https://gist.github。com/Havenard/cc0dec6f61380855367c – Havenard 2014-11-22 01:07:16

+0

該類允許在單個命令中使用準備好的語句進行查詢,例如'Database :: QueryRow('SELECT * FROM users WHERE id =?','i',12345,true)',將返回關聯數組與請求的數據或錯誤的「錯誤」,不需要經過所有數據庫交互過程。 – Havenard 2014-11-22 01:12:52

-2

創建與它連接一個父類,並擴展了父類

class Main { 

    protected $dbh; 

    function dbConnect() { 

     $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 

//DB_HOST, DB_NAME, DB_USER, DB_PASS are set via define() 
//e.g. define("DB_HOST", "localhost"); 

      $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME; 
      $this->dbh = new PDO($dsn, DB_USER, DB_PASS, $options); 

    } 

然後一個子類..

class User extends Main { 

    function crudRead() { 
     parent::dbConnect(); //called from the main class 
     $db = $this->dbh->prepare('SELECT * FROM user'); 
     $db->execute(); 
     return $db->fetchAll(PDO::FETCH_ASSOC); 
     } 
} 
+0

如果我重命名我的主類中的dbConnect()方法,該怎麼辦? – 2014-11-21 21:15:37

+0

錯了。擴展意味着**是一種**關係。你不會擴展到僅僅獲得額外的功能。 – Jimbo 2014-11-28 13:57:27

0

你可以做一個叫做類說「數據庫」處理連接到MySQL並設置PDO。

所以像...

class Database{ 
    private $host  = DB_HOST; 
    private $user  = DB_USER; 
    private $pass  = DB_PASS; 
    private $dbname = DB_NAME; 

    private $dbh; 
    private $error; 

    public function __construct(){ 
     // setup dsn 
     $dns = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname; 
     try{ 
      $this->dbh = new PDO($dsn, $this->user, $this->pass); 
     } 
     catch(PDOException $e){ 
      $this->error = $e->getMessage(); 
     } 
    } 

}

,然後在其他類只分配類變量在其他類等等..

$db = new Database(); 

那會避免你的代碼重複。您也可以在Database類中創建函數來執行PDO查詢。

+0

我有這個想法,但我個人覺得它不好。幾乎是爲我的項目中的每個實體創建新的PDO對象。 – 2014-11-21 21:12:16