需要帮助Factory和Dependency Injection

时间:2011-04-01 15:27:06

标签: php mysql dependency-injection pdo factory-pattern

我正在尝试使用Dependency InjectionFactory类。我已经阅读了很多相关内容,并看到了很多例子。但是我认为我没有正确使用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";
  }      
}

2 个答案:

答案 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);
    }
}