2011-04-01 20 views
0

我試圖通過一個PDO連接對象從一個類到另一個。但我並不是非常成功。我只想實例化一個PDO對象。如何將數據庫連接對象從一個類傳遞到另一個類?

dqhendricksAWM的幫助下,我設法拿到了以下解決方案工作:

class Factory { 

    function createUser($id = NULL) { 
    return new User(Conn::get_conn(), $id); 
    } 
    function createApplication($id = NULL) { 
    return new User(Conn::get_conn(), $id); 
    } 
} 

class Conn { 
    private static $conn = NULL; 

    private function __construct() {} 

    private static function init() { 
     $conf = self::config(); 
     try { 
     self::$conn = new PDO($conf['dsn'], $conf['user'], $conf['pass']); 
     } 
     catch (PDOException $e) { 
     echo $e->getMessage(); 
     } 
    } 

    public static function get_conn() { 
    if (!self::$conn) { self::init(); } 
    return self::$conn; 
    } 

    private static function config($cfg_file = 'sl.config') { 
    $config = parse_ini_file('/../'.$cfg_file); 
    $conf = array(); 

    $conf['user'] = $config['db_user']; 
    $conf['pass'] = $config['db_password']; 
    $conf['dsn']  = 'mysql:dbname='.$config['db_name'].';host='.$config['db_host']; 

    return $conf; 
    } 
} 

在我UserDAO class,我現在可以這樣做:

class UserDAO { 
    private $db; 
    private $id; 

    function UserDAO (&$db, $id) { 
    $this->db = &$db; 
    $this->id = &$id; 
    } 

    public function getRows($sql) 
    { 
    $result = $this->db->query($sql); 
    $row = $result->fetch(PDO::FETCH_ASSOC);  
    return $row;    
    } 

    function getUsers($limit = 10) { 
    $sql ="SELECT * FROM sl_store LIMIT $limit"; 
    return $this->getRows($sql); 
    } 
} 

//My User class 
class User extends UserDAO implements iUser {} 

// And to test it working: 
$user1 = Factory::createUser('5'); 
$user2 = Factory::createApplication('7'); 
+0

您無法從構造函數中返回任何想要確定新語句創建的內容。一個新的聲明總是從命名的類中創建一個對象。 – dqhendricks 2011-04-02 01:59:30

回答

1

如何定義一個抽象類,讓你要求的PDO對象?

E.g.

abstract class Db { 

    private static $x = null; 

    private static function init() { 
    try { 
     self::$x = new PDO(...); 
    } catch (PDOException $e) { 
     ... 
    } 
    } 

    public static function getX() { 
    if (!self::$x) self::init(); 
    return self::$x; 
    } 
} 
+0

你的靈魂更好。謝謝:) – Steven 2011-04-02 08:45:15

+0

我打算使用'依賴注入',但我最終使用'Singelton模式'? – Steven 2011-04-02 08:59:04

+0

哇,[單身模式](http://en.wikipedia.org/wiki/Singleton_pattern)....甚至不知道它有一個名字!乾杯。 :) – awm 2011-04-02 09:56:38

0

這是因爲new Conn()返回$Conn對象,而不是來自$Conn->Conn()方法的值。 試試這個:


class Conn{ 
function Conn() { 
    $db = new PDO($conf['dsn'], $conf['user'], $conf['pass']); 
} 
function get_db() { 
    return $this->db; 
} 
} 

class Factory { 
    function createUser($id = NULL) { 
    $new_conn = new Conn(); 
    $db = $new_conn->get_db(); 
    } 
} 
+0

這沒有奏效。請參閱dqhendricks建議。 – Steven 2011-04-02 07:52:38

1

沒有必要有,如果你想要的是一個不同對象的實例回到你的類中創建自己的一個實例。也許在Conn中創建一個靜態方法來返回一個db連接的實例。

class Conn { 

    // prevent new statement 
    private __construct() {} 

    public static return_pdo() { 
     blah 
     blah 
     blah 
     return $db; 
    } 

    public static config($file) { 
     do stuff 
    } 
} 

然後調用靜態

$pdo = Conn::return_pdo(); 
相關問題