【问题标题】:How can I pass DB connection object from one class to another?如何将数据库连接对象从一个类传递到另一个类?
【发布时间】:2011-04-01 22:51:40
【问题描述】:

我正在尝试将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');

【问题讨论】:

  • 您无法从构造函数返回任何您想要的内容来确定新语句创建的内容。一个新的语句总是从命名的类中创建一个对象。

标签: php mysql object pdo


【解决方案1】:

如何定义一个抽象类,根据请求为您提供 PDO 对象?

例如

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;
  }
}

【讨论】:

  • 你的灵魂更好。谢谢:)
  • 我原本打算使用Dependency Injection,但我最终使用了Singelton pattern 吗?
  • 哇,singleton pattern.... 甚至都不知道它有名字!干杯。 :)
【解决方案2】:

如果您只想要一个不同对象的实例,则无需让您的类创建自己的实例。也许在 Conn 中创建一个静态方法来返回一个数据库连接的实例。

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

【讨论】:

    【解决方案3】:

    这是因为 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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 2013-04-12
      • 2019-10-15
      • 1970-01-01
      • 2021-10-19
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多