簡體   English   中英

PHP-如何從其他(多個)類訪問pdo對象

[英]PHP - How to access pdo object from other (multiple) classes

我將我的MVC切換為使用PDO(我知道,已經過期)。 過去,我的應用程序使用以下類層次結構:

數據庫類>主類>用戶類

(每個擴展另一個)。 但是在創建任何對象之前,已經建立了mysql連接(mysql_connect)。 打開連接后,我可以將Database.class用作包裝器類,通過它可以執行所有查詢。 通過擴展,可以簡單地通過調用“查詢”函數($ this-> query)在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對象運行查詢,則會收到錯誤消息:“在非對象上調用成員函數query()”換句話說,如果User.class擴展了main,則我應該能夠訪問該變量User.class中Main中的$ db(我在創建User對象時調用Main的構造函數)。 問題的一部分是Main.class作為其自己的對象在應用程序中創建的較早,我相信會導致創建兩個PDO實例-這就是為什么它無法通過擴展(通過第二個對象擴展了)的原因database.class)

所以我的問題是:有沒有辦法做到這一點? 還是對我創建的每個對象使用注入的最佳選擇(因為某些腳本包含了多個擴展Main.class的對象-每次嘗試創建PDO的實例)並將pdo對象傳遞給構造函數? 我寧願不必這樣做(標記越少越好),那么另一種選擇是使用所有類都使用的STATIC變量? 最好的方法是什么? (讓我知道這是否令人困惑)

我見過有人為此使用注入,也見過擴展pdo包裝器類的示例(但只有一次)。

謝謝! (我喜歡堆棧溢出!)

您不希望其中任何一個擴展數據庫類,因為從本質上來說,它們將使它們只能擁有一個實例而成為所有單例……您想讓它們使用數據庫類代替。 因此,您會將最抽象的db方法放在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
       }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM