![](/img/trans.png)
[英]How to access PDO connection object across multiple class?[php +Mysql]
[英]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操作。 除非您嘗試實現活動記錄或其他東西,否則甚至可能不需要Main
或Base
類。
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.