2

我有一个类 Club{},它有几个公共函数和私有函数。我拥有的三个私有函数用于从我的数据库中获取数据。这是以下代码:

private function Get_Members_From_DB()
    {
        $sql = "SELECT
                    Email, FirstName, LastName, Gender
                FROM
                    member";

        $result = mysqli_query($this->Con, $sql);

        $arrayResult = array();

        while($row = mysqli_fetch_array($result))
        {
            $arrayResult[] = $row;
        }

        return ($arrayResult);
    }

    private function Get_Members_Interests_From_DB($MemberEmail)
    {
        $sql = "SELECT 
                    interest_type.InterestDescription
                FROM
                    member, member_interests, interest_type
                WHERE
                    member.Email = '$MemberEmail'
                AND
                    member.Email = member_interests.Email
                AND
                    member_interests.InterestID = interest_type.InterestID";

        $result = mysqli_query($this->Con, $sql);

        while($row = mysqli_fetch_array($result))
        {
            $arrayResult[] = $row;
        }

        return ($arrayResult);
    }

    private function Get_Interests_Types_From_DB()
    {
        $sql = "SELECT 
                    InterestID,
                    InterestDescription
                FROM
                    interest_type";

        $result = mysqli_query($this->Con, $sql);

        while($row = mysqli_fetch_array($result))
        {
            $arrayResult[] = $row;
        }

        return ($arrayResult);
    }

当我调用这些时,我mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given在第 406 行收到警告:即while($row = mysqli_fetch_array($result)). 我也Fatal error: Cannot use object of type Club as array in上了第 48 行echo("<tr><td>" . $row1['FirstName'] . " " . $row1['LastName'] . "</td><td>" . $row1['Email'] .

我已经尝试了几个版本,但似乎无法将数据用于以下功能:

public function DisplayMembers()
    {   
        //$members[] = array();
        $interests[] = array();
        $members = new Club();
        $members->Get_Members_From_DB();

        echo ("<table id='membertable'><tr><td colspan='4'>Informatics Club Members</td></tr>
                <tr><td width='130px'>Name</td><td width='170px'>Email</td><td width='60'>Gender</td>
                <td width='280px'>Interests</td></tr>");

        while($row1 = $members)
        {
            echo("<tr><td>" . $row1['FirstName'] . " " . $row1['LastName'] . "</td><td>" . $row1['Email'] . 
                    "</td><td>" . $row1['Gender'] . "</td><td><ul>;");

            $results2 = new Club;
            $results2->Get_Members_Interests_From_DB($row1['Email']);

            while($row2 = mysqli_fetch_array($results2))
            {
                $interests[] = $row2;
                echo("<li>" . $row2['InterestDescription'] . "</li>");
            }

            echo("</ul></td></tr>");
        };

        echo "</table><br>";
}

我已更改private function Get_Members_From_DB()为:

$sql = "SELECT
                    Email, FirstName, LastName, Gender
                FROM
                    member";

        $result = mysqli_query($this->Con, $sql); return ($result);

如果我在上面发布的第一个错误,它仍然无法在DisplayMembers()函数中工作,除了它会在第 46 行,它将更改为:while($row1 = mysqli_fetch_array($members)) 如果我将上面的代码直接粘贴到DisplayMembers()我可以得到函数正确显示为 HTML 表格。我不明白为什么将代码分成私有函数时会出错。有任何想法吗?

编辑:我从 SAME 类中的公共函数调用这些私有函数。

4

3 回答 3

5

我将帮助您逐节分析您的代码。第一部分看起来像这样......

$members = new Club();
$members->Get_Members_From_DB();

Get_Members_From_DB()返回一个值,但您不要将此值存储在任何地方。此外,您已经在 Club 类中,因此我们不需要新的 Club。而是试试这个...

$members = $this->Get_Members_From_DB();

接下来,你有...

while($row1 = $members)

但是您只是分配(复制)$members$row1这里。只要$members是真实的,这将永远循环。相反,考虑这个...

foreach ($members as $member)
{
    // Do something with $member
}

最后,您在获取兴趣结果时遇到了类似的问题。你的代码是...

$results2 = new Club;
$results2->Get_Members_Interests_From_DB($row1['Email']);

while($row2 = mysqli_fetch_array($results2))
{
    $interests[] = $row2;
    echo("<li>" . $row2['InterestDescription'] . "</li>");
}

同样,Get_Members_Interests_From_DB()正在返回一些东西,但您没有存储该值。换成这个怎么样...

$interests = $this->Get_Members_Interests_From_DB($member['Email']);
foreach ($interests as $interest)
{
    echo '<li>', $interest['InterestDescription'], '</li>';
}
于 2013-05-01T15:32:53.997 回答
2

在 php7 中引入了匿名类。您只需要创建一个类来扩展具有私有功能的类。然后,您可以向其中添加任何函数,并为私有函数创建一个访问器。您还需要创建一个转换器来将旧类的对象转换为新类的对象,就是这样。

这就是你所需要的。

你可以不使用 php7,但使用 php7 你可以避免在其他地方创建类定义。使用 php7,您可以在一个函数或一个类方法中进行所有转换。不是很酷吗?

于 2018-01-15T03:42:51.220 回答
1

您不能在定义它们的类之外访问“私有”函数。正如西蒙所说,您需要将这些公开。

您应该阅读PHP 手册中的可见性,它将教您公共、受保护和私有函数之间的区别。这是一个简短的示例:

class Example {

    public function aPublicMethod()
    {
        return 'public';
    }

    private function aPrivateMethod()
    {
        return 'private';
    }

}

$example = new Example;
// $aPublicString will become 'public'
$aPublicString = $example->aPublicMethod();
// error, you cannot see private functions outside of a class
$aPrivateString = $example->aPrivateMethod();
于 2013-05-01T08:54:41.543 回答