Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与PHP类/函数正确交互?(OOP)_Php_Oop_Class - Fatal编程技术网

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

与PHP类/函数正确交互?(OOP),php,oop,class,Php,Oop,Class,我开始使用PHP类并研究OOP 我创建了一个类似以下内容的数据库类(代码片段): 为了测试,我创建了另一个名为Guestbook的类,如下所示: class Guestbook { function fetch() { Database::query('SELECT * FROM guestbook LIMIT 2'); while($row = Database::fetch()){ $result_array[] = $row

我开始使用PHP类并研究OOP

我创建了一个类似以下内容的数据库类(代码片段):

为了测试,我创建了另一个名为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->count()
时,它会回显上一次的计数,而不是2(因为我在留言簿获取函数中设置了限制2)

如何正确地与这些类进行交互,以便在全局范围内使用类似
$db->count()


提前感谢您提供的任何提示或解决方案

当您从guestbook->fetch()方法获得结果时,为什么要使用db类中的count

这样做的技巧完全相同:

echo count( $resutls );

首先,没有理由在OOP中包装
mysql.*
实现。如果您要进行OOP,那么只需使用
Mysqli
PDO
即可,它们具有可以扩展的OOP类


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

请参见
$db
是类数据库的对象 切勿访问留言簿的功能或属性

您可以通过
count($resutls)

或者可能必须遵循继承的概念


感谢您将类的静态版本与实例化版本混合在一起。如果您希望能够创建一个类的多个实例,那么应该有一个_构造函数。虽然这不是必需的,但最好是有一个

您正在创建一个新实例并将其分配给$db变量($db=new Database();)。但是,在GuestBook类中,您是静态地引用数据库类(database::)。该语法引用的“基类”在所有实例中都是相同的。您要做的是引用您创建的数据库类的实例。通常,您会将要使用的数据库实例传递到构造函数中的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);

对于如何使用OOP包装数据库访问器并仍然全局访问count(),很难给出明确的建议

显然你的代码是错的

通过使用符号

Database::query
您指的是数据库类上的某种静态方法,这似乎不是本文的目的。看起来您的代码不会因为与PHP4的向后兼容性而崩溃

您可以通过以下方式重写留言簿:

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();

这种技术使用一种称为“依赖注入”的模式

为什么要从分类的留言簿静态调用数据库?如果你想静态地使用它,你应该这样声明,并且只能这样使用:)我建议将数据库设置为单例。问题是静态调用和对象调用混合在一起。将其规格化,以便在任何地方使用静态或对象。一个建议是查看Singleton模式。另一件事是,您通常会将所有抓取都保存在Guestbook类中。您可以调用$guestbook->getPosts(),然后通过私有或受保护的getDataRow()方法获取所需的数据,该方法将数据设置为guestbook中的受保护变量,以便您可以访问任意次数的数据,而无需每次访问数据库。@BobKruithof非常感谢您的提示。我会据理力争的@米克汉森,我也来看看单例模式。非常感谢。我只是在玩弄这个话题。我想了解它,所以我自己创造了一些东西。这不会在任何实际项目中使用。我明白,我只是说你在用一条糟糕的道路来试图获得这种理解:——)@Fabian real project与否,浪子给了你非常有用的指示,告诉你如何improve@DamienPirsy这就是为什么我给+1;)在这种情况下没有理由这么做,伊姆霍。但是如果您真的需要它,您可以从Guestbook返回整个db对象。这不是你通常会做的,因为你只是为一些已经存在的东西创建了不必要的代码。
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();