PHP - 如何从其他(多个)类的访问PDO对象(PHP - How to access pdo

2019-10-18 11:40发布

我交换我的MVC使用PDO(我知道,逾期)。 我的应用程序,在过去,使用下面的类层次结构:

Database.class> Main.class> User.class

(每一个延伸的除外)。 但是,在创建任何对象之前,MySQL连接被做(的mysql_connect)。 一旦连接是开放的,我可以用Database.class,通过它进行我的所有查询的包装类。 通过extention,在User.class查询可以简单地通过调用“查询”功能($这个 - >查询)制成。

使用PDO,我试图模仿的过程,但发现的错误。 我创造了Database.class一个单功能:

function __construct()
{
    $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

public static function getInstance()
{
    if (!isset(self::$instance)){
        $object = __CLASS__;
        self::$instance = new $object;
    }
    return self::$instance;
}

function query($qry,$params=NULL){
    $qry = $this->db->prepare('SELECT * FROM users WHERE userID = :userID');
    $qry->execute(array(':userID' => 1));
    $results = $qry->fetchAll(PDO::FETCH_ASSOC);
    return $results;
}

然后在Main.class我得到的实例:

function __construct()
{
    $this->db = parent::getInstance();
}

因此,在User.class我打电话

function __construct(){
    parent::__construct();
}
function test(){
    return $this->db->query("test");
}

所以,我可以运行从Main.class对象精细任何疑问。 但是,如果我尝试从User.class对象我得到的错误查询:“调用一个成员函数查询()一个非对象”换句话说,如果User.class扩展主我应该能够访问变量从User.class(我打电话时创建的用户对象主要构造)的主要$分贝。 这个问题的部分原因是,Main.class较早的应用程序创建的,因为它是自己的对象,我相信导致PDO的两个实例被创建 - 这就是为什么它不通过延长工作(通过还延伸了第二个对象database.class)

所以我的问题是:有没有办法做到这一点? 或者是使用注射我创建的每一个对象(因为一些脚本包含扩展Main.class多个对象 - 它试图创建每次PDO的实例)我最好的选择和PDO对象传递给构造函数? 我宁愿没有做到这一点(少标记的更好),因此另一种选择是使用一个静态变量的所有类使用? 什么是最好的方法是什么? (让我知道,如果这是令人困惑)

我见过使用注射这个人,和我见过扩展PDO包装类(但只有一次)的例子。

谢谢! (我爱堆栈溢出!)

Answer 1:

你不希望任何这些扩展数据库类,因为这实际上将使他们所有单身其中的...你想让他们使用的数据库类,而不是只能有一个实例。 所以,你会把你最抽象的分贝方法Database ,然后是为特定事物的查询将是对方法的User或者你有什么。 这意味着你的Database实际上包PDO和是所有其他类一起工作的DB操作。 在MainBase类甚至可能不会需要的,除非你试图实现活动记录什么的。

class Database {
   static protected $instance;

   /**
    * @var PDO
    */
   protected $connection;

   protected function __construct($dsn, $user, $pass, $attrs = array()) {
       // create pdo instance and assign to $this->pdo
   }

   public static function getInstance() {
       if(!self::$instance) {
           // get the arguments to the constructor from configuration somewhere
           self::$instance = new self($dsn, $user, $pass);
       }

       return self::$instance;
   }

   // proxy calls to non-existant methods on this class to PDO instance
   public function __call($method, $args) {
       $callable = array($this->pdo, $method);
       if(is_callable($callable)) {
           return call_user_func_array($callable, $args);
       }
   }
}

class Main {
   protected $db;

   public function __construct() {
      $this->db = Database::getInstance();
   }   
}

    class User extends Main{

       public function __construct() {
            parent::__construct();
       }

       public function findById($id) {
           $qry = $this->db->prepare('SELECT * FROM users WHERE userID = :userID');
           $qry->execute(array(':userID' => $id));
           $results = $qry->fetchAll(PDO::FETCH_ASSOC);

           return $results
       }
    }


文章来源: PHP - How to access pdo object from other (multiple) classes