0

我有一个类包含一组类。遍历数组并尝试运行 Class 函数时,出现错误:

Fatal error: Call to a member function getTDs() on a non-object on line 21

这是我的代码:

汽车类

class Cars {
    private $cars = array();

    public function __construct(){
        $result = DB::getData("SELECT * FROM `cars` ORDER BY `name`");

        foreach($result as $row){
            $this->cars[] = new Car($row);
        }
    }

    public function printTable(){
        $html = '<table>';
        for($i=0, $l=count($this->cars); $i<$l; $i++){
            $html .= '<tr>';
            $html .= $this->cars[$i]->getTDs();
            $html .= '<td></td>';
            $i++;
            //print_r($this->cars[$i]);
            //print_r($this->cars[$i]->getTDS());
            $html .= $this->cars[$i]->getTDs(); //This is the supposed non-object
            $html .= '<td></td>';
            $i++;
            $html .= $this->cars[$i]->getTDs();
            $html .= '</tr>';
        }
        $html .= '</table>';
        echo($html);
    }
}

汽车类

class Car {
    public $data;

    public function __construct($data){
        $this->data = $data;
    }

    public function getTDs(){
        $html = '<td>'.$this->data['name'].'</td>';
        return $html;
    }
}

print_r在那个“非对象”(第 19 行)上使用时,我得到了这个:

Car Object
(
    [data] => Array
    (
        [name] => 'Ferrari'
    )
)

print_r“非对象”调用getTDs()(第 20 行)上使用时,我得到以下信息:

<td>Ferrari</td>

那么,当我尝试将该结果添加到我的$html变量中时,它会在下一行中断吗?

4

2 回答 2

3

您的 for 声明是:

for($i=0, $l=count($this->cars); $i<$l; $i++){

但是在那个循环中,你又增加$i了两倍。

$i++;
$i++;

因此,在循环的最后一次迭代中,$i指向 的最后一个元素cars,但是当您$i再次递增时,您将到达数组的末尾。

所以在你到达太远之前停止循环。您的修复应该是:

for($i=0, $l=count($this->cars)-2; $i<$l; $i++){

编辑cars每次尝试访问索引时检查您是否位于数组的末尾会更聪明。

于 2013-09-11T20:18:13.170 回答
-1

你在循环内增加你的索引,你不需要这样做。这应该可以正常工作:

for($i=0, $l=count($this->cars); $i<$l; $i++){
        $html .= '<tr>';
        $html .= $this->cars[$i]->getTDs();
        $html .= '<td></td>';
        $html .= "</tr>";
}

此外,作为最佳实践,请尝试在循环外使用计数,它具有更好的性能。

$numCars = count($this->cars);
for($i=0; $i<$numCars; $i++)
{
  ...
}
于 2013-09-11T20:30:09.150 回答