我遇到了一个奇怪的问题。我正在学习PHP(曾经用Java编程),我正在尝试做一件简单的事情。我有一个DAO方法,可以做这样的事情:
while (oci_fetch($parse)) {
$stats = new Stats();
$stats->setId($id);
$stats->setName($name);
$stats->setEmail($email);
$stats->setGender($gender);
$stats->setBirthday($birthday);
$statslist[] = $stats;
}
return $statslist;
我还有另一个使用此函数的PHP文件(称为getById)作为测试,如下所示:
$statsdao = new StatsDAO();
$statslist[] = $statsdao->getById(1);
foreach ($statslist as $stat) {
echo $stat->getName();
}
这看起来很简单:DAO返回一个数组,我的另一个文件读取返回的Stats数组并打印出来。但我收到此错误消息:
致命错误:在非对象中调用成员函数getName() 第25行/var/www/socializi/interfaceusuario/index.php
奇怪的是:如果我在DAO的getById函数中调用foreach循环,它会将其打印好,但是当我从外部调用该函数并将其分配给另一个数组时,它不会将该数组的内容识别为对象。
我在这里做错了什么? 谢谢!
答案 0 :(得分:3)
尝试这样:
$statsdao = new StatsDAO();
$statslist = $statsdao->getById(1);
foreach ($statslist as $stat) {
echo $stat->getName();
}
你添加一个不再提供服务的[]然后将数组放在另一个数组中,从而为你提供
$statslist[0][0]->getName(); //would only work on php 5.4 with this syntaxe but it shoes the idea.
一个级别太深了。
将另一个foreach放在第一个也将修复它但它的丑陋并没有任何作用:
$statsdao[] = new StatsDAO();
$statslist = $statsdao->getById(1);
foreach ($statslist as $stats) {
foreach ($stats as $stat) {
echo $stat->getName();
}
}
答案 1 :(得分:0)
您不需要括号。设置$ statslist时。通过将括号放在PHP中,告诉PHP您要创建一个新数组并将第一个键(0)设置为getById()
的返回值。这导致了一个数组数组。你真的不想要那个。
$statsdao = new StatsDAO();
$statslist = $statsdao->getById(1);
foreach ($statslist as $stat) {
echo $stat->getName();
}
答案 2 :(得分:0)
共鸣是您正在使用$statslist[] = $statsdao->getById(1);
,这会在$ statslist数组的第一个元素内创建结果。所以放下[]。
您可以激活error_reporting(E_ALL);
以避免此类问题。这将告诉您,您正在尝试追加非数组变量的元素。
修改强>
如果数组不存在,我错误地记得PHP给出了这个通知。但似乎方括号表示法$array[]
创建了一个数组$ array,如果它不存在的话。
error_reporting(E_ALL);
在发展环境中仍然是一个好主意。帮助您避免错误来源。