如何将DB连接对象从一个类传递到另一个类?

时间:2011-04-01 22:51:40

标签: php mysql object pdo

我正在尝试将PDO连接对象从一个类传递到另一个类。但我不是很成功。我只想实现一个PDO对象。

dqhendricks awm 的帮助下,我设法让以下解决方案正常运行:

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');

3 个答案:

答案 0 :(得分:2)

如何定义一个抽象类,根据请求为您提供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;
  }
}

答案 1 :(得分: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();

答案 2 :(得分: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();
  }
}