我是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调用。