我交换我的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包装类(但只有一次)的例子。
谢谢! (我爱堆栈溢出!)