我正在尝试使用Dependency Injection和Factory类。我已经阅读了很多相关内容,并看到了很多例子。但是我认为我没有正确使用DI(对于那个主要的Facotry类。
我无法查询我的数据库。我收到错误:
Fatal error: Call to undefined method Conn::query()
。
问题出在getRows($sql)
函数中。
我似乎无法正确使用DI而且无法使用PDO
个功能。
有人能指出我正确的方向,也许看看我做错了什么?
到目前为止,这是我的代码。
$user = Factory::createUser();
$result = $user->getUsers();
print_r($result);
以下是所有其他课程:
class Factory {
// I think I'm using Dependency Injection here
function createUser($id = NULL) { return new User(new Conn(), $id); }
}
//Returns PDO conection and that's it.
class Conn {
function config($cfg_file = 'sl.config') {
/* The code here returns $conf array */
}
function Conn() {
$conf = $this->config();
try { return new PDO($conf['dsn'], $conf['user'], $conf['pass']); }
catch (PDOException $e) { echo $e->getMessage(); }
}
}
interface iUser {
public function getSomething();
}
// This is where I do all my SQL queries and return results.
class UserDAO {
private $db = NULL;
private $id;
function UserDAO (&$db, &$id = NULL) {
$this->db = &$db;
$this->id = &$id;;
}
public function getRows($sql)
{
$result = $this->db->query($sql); // <------- THIS IS NOT WORKING
$row = $result->fetch(PDO::FETCH_ASSOC);
return $row;
}
function getUsers($limit = 10) {
$sql ="SELECT * FROM users LIMIT $limit";
return $this->getRows($sql);
}
}
class User extends UserDAO implements iUser {
public function getSomething() {
echo "Something";
}
}
答案 0 :(得分:0)
您正在向User构造函数传递连接和ID
return new User(new Conn(), $id);
由于User类没有构造函数,因此php会触发基类的构造函数
function UserDAO (&$db, &$id = NULL) {
$this->db = &$db;
$this->id = &$id;;
}
所以基本上你在UserDAO想要一个db对象时传递一个连接对象
这就是为什么它试图在query
对象上运行Conn
函数
答案 1 :(得分:0)
您正试图在Conn
构造函数中返回一个对象,但这不会发生。构造函数返回void
。添加其他方法,例如我在下面添加的getDatabaseObject
方法,以返回您的PDO
对象。
class Conn {
function Conn() {
$conf = $this->config();
}
public function getDatabaseObject() {
try { return new PDO($conf['dsn'], $conf['user'], $conf['pass']); }
catch (PDOException $e) { echo $e->getMessage(); }
}
}
class Factory {
// I think I'm using Dependency Injection here
function createUser($id = NULL) {
$c = new Conn();
return new User($c->getDatabaseObject(), $id);
}
}