我有一个俱乐部{},它有几个公共职能和私人职能。我拥有的三个私有函数用于从我的数据库中获取数据。以下是代码:
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);
}
当我打电话给这些时,我会在第406行收到警告:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
,即while($row = mysqli_fetch_array($result))
。我还在第48行获得了Fatal error: Cannot use object of type Club as array in
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类中的公共函数调用这些私有函数。
答案 0 :(得分:3)
我会帮助您逐节分析您的代码。第一部分看起来像这样......
$members = new Club();
$members->Get_Members_From_DB();
Get_Members_From_DB()
返回一个值,但您不会将此值存储在任何位置。此外,您已经在俱乐部课程中,因此我们不需要新的俱乐部。相反,试试这个...
$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>';
}
答案 1 :(得分:1)
你无法访问他们所定义的课程之外的“私人”功能。正如Simon评论的那样,你需要公开这些功能。
您应该阅读PHP手册中的visibility,它将教您公共功能,保护功能和私有功能之间的区别。这是一个简短的例子:
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();
答案 2 :(得分:1)
在php7中引入了匿名类。 您所需要的只是创建一个使用私有函数扩展类的类。 然后,您可以向其添加任何函数,并为事件创建私有函数的访问器。您还需要创建一个转换器,将旧类的对象转换为新类的对象,就是这样。
这就是你所需要的一切。
你可以在没有php7的情况下完成它,但是使用php7你可以避免在其他地方创建类定义。使用php7,您可以在一个函数或一个类方法中进行所有转换。它不酷吗?