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

时间:2013-11-19 16:50:43

标签: php oop

我是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()

我尝试了几种不同的方法来实现这个目标,但我无法这样做。

2 个答案:

答案 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对象来执行数据库调用。