我是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()
我尝试了几种不同的方法来实现这个目标,但我无法这样做。
答案 0 :(得分:2)
有没有办法可以自动调用它,以便我可以启动对象
这不是任何代码的理想属性;它会阻止代码的可测试性;忽略你的课程的不幸命名,我会这样设置:
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());
答案 1 :(得分:0)
您的Database
班级没有任何数据库。
它没有做任何事情。
您需要在某处使用MySQLi或PDO对象来执行数据库调用。