-1

我是 OO PHP 新手,我创建了一个数据库类,当我使用 JOIN 方法构建我的 SELECT 查询时遇到问题。

如果我在函数中进行查询。

<?php
    require_once("class.Database.php");

    function test1($db) {
        $test1 = $db->Select("*")
            ->From("Table1")
            ->Join("Table2","table_2_id = table_1_id")
            ->Join("Table3","table_3_id = table_2_id")
            ->BuildSelect();

        return $test1;
    }

    function test2($db) {
        $test2 = $db->Select("*")
            ->From("Table4")
            ->Join("Table5","table_5_id = table_4_id")
            ->Join("Table6","table_6_id = table_5_id")
            ->BuildSelect();

        return $test2;
    }

    echo test1($db);
    echo "<br>";
    echo test2($db);
?>

问题是第一个函数 - test1 会打印出来 - SELECT * FROM Table1 LEFT JOIN Table2 ON table_2_id = table_1_id LEFT JOIN Table3 ON table_3_id = table_2_id - 这很好

但随后第二个函数 test2 将打印出 - SELECT * FROM Table4 LEFT JOIN Table2 ON table_2_id = table_1_id LEFT JOIN Table3 ON table_3_id = table_2_id LEFT JOIN Table5 ON table_5_id = table_4_id LEFT JOIN Table6 ON table_6_id = table_5_id

test2 函数似乎正在打印出 test1 函数的 JOIN 方法中的值以及它自己的 JOIN 方法中的值。

有人可以帮忙吗。

4

1 回答 1

1

您添加的Reset()方法就是您所需要的。

除了您的join数组之外,您的所有成员变量都在每次调用时被重置。例如:

$this->where = trim($where);

where每次调用您的Where()方法时,它将替换您的成员。相反,您在Join()方法中执行此操作:

 $this->join[] = ...

它将一个值添加到成员数组的末尾,而不是重写数组中已有的内容。它与使用具有相同的效果array_push() (请参见此处)

我要提出的最后一个建议是Reset()在结束时调用,BuildSelect()这样您就不必记住在查询中这样做,但看起来您已经这样做了。然而,我的建议是改变这一点:

self::Reset();

对此:

$this->Reset();

实际上,两者都可以工作,PHP 使它们在功能上与您要完成的工作相同,但其他语言就没有那么宽容了。::被设计用于调用静态成员,但早期版本的 PHP 做了“自动”的事情,即意识到您是从实例化的类调用并将self::其视为$this->

我的理解是,更高版本的 PHP(5.3+)指的是在定义点包含在范围内的内容,而不是在您使用self::. 在大多数情况下,您会希望在执行时引用类的范围。我对此有两个注意事项:

  1. 我从来没有允许使用self::when$this->是合适的,所以我在这里说的只是道听途说(我从未测试过它是真的)

  2. 鉴于您的Reset()方法不对实例化变量执行任何形式的逻辑这一事实,它不会对您正在使用的特定代码产生任何不利影响。但最好从良好的编码习惯开始。一段时间后,如果你继续用 PHP 编码,这种做法会咬你一口。

当您第一次学习 PHP 时可能会很棒,但是如果您不是刻意编码,那么当您开始制作任何具有长期影响的项目时,那些让学习变得很棒的东西常常会再次困扰您。

于 2013-08-10T07:28:22.140 回答