2012-07-17 45 views
-3

我對我的PDO數據庫訪問類有以下類設計。PHP PDO類設計

$ conn = new db()的最佳位置在哪裏? (目前在Database.php中)? 記住一個MVC風格的框架,Main.php是控制器,另外兩個是Models。

謝謝。

database.php中

class db { 
    private $conn; 

    public function __construct() { 
     $this->conn = new PDO(...); 
    } 

    $conn = new db(); 
} 

Class.php

// require Database.php 

class someClass { 
    private $conn; 

    public function __construct(db $conn) { 
     $this->conn = $conn; 
    } 

    function myFunc($usr, $pwd) { 
     // SQL 
    } 
} 

Main.php

// require Class.php 
$myObj = new someClass($conn); 

$myObj->myFunc(PARAMS); 
+1

你爲什麼要重新審視輪子?使用像Doctrine2或其他ORM的東西。 – Stony 2012-07-17 14:11:30

+2

您遷移到[codereview](http://stackoverflow.com/questions/11522025/pdo-class-design)的先行文章。你爲什麼重新發布它? – j0k 2012-07-17 14:21:10

+0

是的,你是正確的,代碼是相同的。然而,我的問題不同,因爲在這篇文章中,我關心的是實例化$ conn對象的最佳方式。 codeoverview上的帖子與設計模式本身有關,我也很感謝您的反饋。謝謝。 – 2012-07-17 14:28:26

回答

1

正如你所知道的,$conn需要在someClass定義之外並在實例化someclass之前進行聲明。所以,有一些我能想到的兩個選項:在db

$conn = new db(); 
$myObj = new someClass($conn); 

或者,使用singleton design pattern

創建之前$myObj對象,並將其傳遞給構造函數聲明它

$conn = db::getInstance(); 
$myObj = new someClass($conn); 

db::getInstance()被定義爲:

class db { 
    private $conn; 

    // Don't let anyone instantiate this class by themselves 
    private function __construct() { 
     $this->conn = new PDO(...); 
    } 

    private static $instance = null; 
    public static getInstance() { 
     if(self::$instance === null) { 
      self::$instance = new db(); 
     } 
     return self::$instance; 
    } 
} 
+0

感謝您的回覆。那麼我會在哪裏調用$ conn = db :: getInstance();? – 2012-07-17 14:30:19

+0

@Downvoter - 有何評論? – nickb 2012-07-28 16:06:24

+2

-1當然。爲什麼不。 **當他們清楚地掌握依賴注入時,不要告訴人們使用單身**。你推薦的是引入反模式。 – 2012-07-28 16:09:21