避免在每个类中创建新的PDO

时间:2014-11-21 15:48:43

标签: php oop design-patterns pdo

   function __construct($name, $lastName, $address, $rollNo)
    {
           $this->name = $name;
           $this->lastName = $lastName;
           $this->address = $address;
           $this->rollNo = $rollNo;

           $this->conn = new \PDO('mysql:host=localhost;dbname=students', 'root', '');
    }

    public function getUser($id){
        $sql = "SELECT * FROM students WHERE id = ".intval($id);

        foreach($this->conn->query($sql) as $row){
            $user['name'] = $row['name'];
            $user['address'] = $row['address'];
            $user['roll_no'] = $row['roll_no'];  
        }
        return $user;

    }

所以我想学习的是如何在所有类中使用单个PDO对象,而不是在所有类中创建$ conn,如用户,课程等。

我发现了Dependency Injection,Singleton,Factory这个词,对我来说,作为初学者,这些都是混淆的。

另外,我想知道我在为代码创建PDO的新对象时所做的不好。

3 个答案:

答案 0 :(得分:2)

单例是一个控件类,它将确保一次只存在给定对象的一个​​实例。因此,不是在每个对象中调用$conn = new PDO(),而是创建多个PDO()实例,您可以编写一个名为Database的单例类,而不是使用$conn = Database::instance()

class Database
{
    static $instance = null;
    static function instance()
    {
        if (self::$instance == null)
            self::$instance = new PDO('mysql:host=localhost;dbname=students', 'root', '');
        return self::$instance;
    }
}

基本上它的作用是创建一个PDO()类(如果它不存在),并在之前已经实例化时重用它。

作为一个优势,您也不需要将数据库凭据分布在整个项目中。班级Database将拥有它而不是其他人。

答案 1 :(得分:0)

您可以创建一个名为“数据库”的类来处理连接MySQL和设置PDO。

就像......

class Database{
    private $host      = DB_HOST;
    private $user      = DB_USER;
    private $pass      = DB_PASS;
    private $dbname    = DB_NAME;

    private $dbh;
    private $error;

    public function __construct(){
        // setup dsn
        $dns = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass);
        }
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }

}

然后在你的其他类中,只需将类分配给其他类中的变量即可。

$db = new Database();

这样可以避免代码重复。您还可以在Database类中创建函数以执行PDO查询。

答案 2 :(得分:-2)

创建一个包含连接的父类,并创建一个扩展父类的子类

class Main {

    protected $dbh;

    function dbConnect() {

        $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);

//DB_HOST, DB_NAME, DB_USER, DB_PASS are set via define() 
//e.g. define("DB_HOST", "localhost");

            $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME;
            $this->dbh = new PDO($dsn, DB_USER, DB_PASS, $options);

    }

然后..

class User extends Main {

    function crudRead() {
        parent::dbConnect(); //called from the main class
        $db = $this->dbh->prepare('SELECT * FROM user');
        $db->execute();
        return $db->fetchAll(PDO::FETCH_ASSOC);
        }
}