正确地与PHP类/函数交互? (OOP)

时间:2012-03-02 14:13:16

标签: php oop class

我开始使用PHP类并查看OOP。

我通过创建一个看起来像这样的数据库类(片段)来玩游戏:

class Database
{

private $link;
private $result;
private $count;

    function connect()
    {
        $this->link = mysql_connect(DB_HOST, DB_USER, DB_PW);
        $return = $this->link ? 'Connected to database.' : 'Failed to connect.';
        $this->open(); // I have another function in this class to select the db
        echo $return;
    }

    function query($query)
    {
        $this->result = mysql_query($query);

    }

    function fetch()
    {
        return mysql_fetch_assoc($this->result);

    }

    function count()
    {
        $this->count = mysql_num_rows($this->result);
        return $this->count;
    }
}

为了测试,我创建了另一个名为Guestbook的类,如下所示:

class Guestbook
{

    function fetch()
    {
        Database::query('SELECT * FROM guestbook LIMIT 2');
        while($row = Database::fetch()){
        $result_array[] = $row;

        return $result_array;
    }   

}

现在我测试了调用函数:

$db = new Database();
$db->connect();
$db->query('SELECT * FROM test');
while($row = $db->fetch()) {
    echo $row['id'].'<br />';
}
echo $db->count();
$db->close();

这可以按预期工作。所以我继续使用留言簿课程:

$db->connect();
$guestbook = new Guestbook();
$results = $guestbook->fetch();

foreach($results as $gb) {  
    echo $gb['id'];
}

echo $db->count(); // HERE'S MY PROBLEM !

$db->close();

一切都按照我的意愿运作,但第二次拨打$db->count() 回显先前的计数而不是2(因为我在留言簿提取功能中设置了LIMIT 2)。

如何正确地与这些类进行交互,以便全局使用$db->count() 之类的内容?

提前感谢任何提示或解决方案!

5 个答案:

答案 0 :(得分:4)

首先,没有理由将mysql_*实现包装在OOP中。如果您要进行OOP,那么只需使用可以扩展的OOP类的MysqliPDO

其次,您希望在GuestBook类中保存数据库的实例,而不是使其成为Database类本身的扩展。

答案 1 :(得分:2)

很难就如何使用OOP包装数据库访问器并仍然全局访问count()提供明确的建议。

显然你的代码是错误的。

使用符号

Database::query

你指的是Database类上的某种静态方法,这似乎不是这里的意图。看起来你的代码没有崩溃,因为它与PHP4有一些向后兼容性。

你可以这样重写Guestbook:

class Guestbook
{

    private $db;

    function __construct(&$db) {
        $this->db = $db;
    }

    function fetch($option)
    {
        $this->db->query('SELECT * FROM guestbook LIMIT 2');
        while($row = $this->db->fetch()){
        $result_array[] = $row;

        return $result_array;
    }   

}

然后

$db = new Database();
$db->connect();
$guestbook = new Guestbook($db);
$results = $guestbook->fetch();
echo $db->count();

此技术使用称为“依赖注入”的模式

答案 2 :(得分:1)

为什么在获得来自guestbook-&gt; fetch()方法的结果时会使用db类中的count?

这完全是同样的伎俩:

echo count( $resutls );

答案 3 :(得分:0)

请参阅$db是类Database的对象 永远不会访问留言簿的功能OR属性

您可以直接使用count( $resutls )

来解决此问题

OR可能必须使用继承概念

由于

答案 4 :(得分:0)

您将静态与类的实例化版本混合在一起。如果您希望能够创建类的多个实例,则应该具有__construct函数。虽然不是必需的,但最好还是有一个。

您正在创建一个新实例并将其分配给$ db变量($ db = new Database();)。但是在您的GuestBook类中,您将静态引用数据库类(Database::)。该语法引用了所有实例中相同的“base”类。您要做的是引用您创建的数据库类的实例。通常,您会将数据库实例传递给构造函数中的GuestBook类,将其存储在类变量中,然后使用$ this引用它。

class Guestbook
private $db = null;
{
    function __construct($db) {
        $this->db = $db;
    }

    function fetch($option) {
        $this->db->query('SELECT ...');
        ...
    }
}

$db = new Database();
$guestbook = new Guestbook($db);