正在构造内部调用数据库集方法


Calling database set method inside construct

我是OOP的新手,所以这可能是一个简单的解决方案。我正在尝试稍微清理一下我的代码,这样在创建对象时就不必做太多了。我的代码如下:

include "Database.php";
Class Database {
    protected $conn;
    public function setDb($conn){
        $this->conn = $conn;
    }
}
Class Images extends Database{
    protected $conn;
    protected $stmt;
    function __construct(){
    }
    public function RetrieveImages(){
        $this->stmt = $this->conn->prepare('SELECT * FROM `pictures`');
        $this->stmt->execute();
        $boom = $this->stmt->fetchAll();
        return $boom;
    }
}
$db = new Images();
$db->setDb($conn);
$test = $db->RetrieveImages();
var_dump($test);

Database.php:

try{
    $conn = new PDO('mysql:host=localhost;dbname=testing', 'blah','boom!');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    echo'ERROR: ' . $e->getMessage();
}

这段代码运行良好,但我想自动化$db->setDb($conn);部分。有没有一种方法我可以自动调用它,这样我就可以启动像这样的对象

$db = new Images();
$db->RetrieveImages();

我已经尝试添加

$db = new Database();
$db->setDb($conn);

到Images类中的构造函数方法,但我得到了一个错误

调用非对象上的成员函数prepare()

我尝试了几种不同的方法来实现这一点,但我无法做到。

有没有一种方法我可以自动调用它,这样我就可以启动对象

对于任何代码来说,这都不是一个非常理想的特性;它阻止代码的可测试性;忽略类的不幸命名,我会这样设置:

class Database 
{
    protected $conn;
    public function __construct($conn)
    {
        $this->conn = $conn;
    }
}

然后你的Images类变成:

class Images extends Database
{
    public function RetrieveImages()
    {
        $stmt = $this->conn->prepare('SELECT * FROM `pictures`');
        $stmt->execute();
        return $stmt->fetchAll();
    }
}

称之为

// $conn was created in "Database.php"
$images = new Images($conn);
print_r($images->RetrieveImages());

您的Database类没有任何数据库。

它没有任何作用。


您需要有一个MySQLi或PDO对象来执行databsse调用。