我正在尝试创建Item对象的集合,并通过面向对象的编程风格在屏幕上显示它们。我有两个名为LineItem和ObjectCollection的类。 LineItem类保存每个item对象,ObjectCollection保存所有lineitems的集合数据。下面的代码显示了我的LineItem类和ObjectCollection类。
class LineItem {
private $item;
private $quantity;
public function __construct($item, $quantity) {
$this->item = $item;
$this->quantity = $quantity;
}
public function __toString() {
return "Item = ".$this->item." : Quantity = "
.$this->quantity;
}
public function setQuantity($quantity) {
$this->quantity = $quantity ;
}
public function getQuantity(){
return $this->quantity;
}
public function changeQuantity($value){
$this->quantity += $value;
}
public function getItem(){
return $this->item;
}
}
ObjectCollection:
class ObjectCollection {
//This is an array to hold line items
private $line_items_array ;
private $lineCounter; //Count the number of line items
public function __construct() {
//Create an array object to hold line items
$this->line_items_array = array();
$this->lineCounter = 0;
}
// This will add a new line object to line items array
public function addLineItem($line_item) {
$this->lineCounter++;
$this->line_items_array[] = $line_item;
}
public function getLineCount(){
return $lineCounter;
//return $this->lineCounter;
}
public function getLineItem(){
return $this->line_items_array;
//return $line_items_array;
}
}
然后我添加了更多代码,为LineItem添加了2个新项目。与此同时,我将这些结果添加到我的对象集合中。
$ca = new ObjectCollection();
$item1 = new Item("1",3.45);
$item1->setDescription("Description for Item 1");
$item1->setImage("Image1");
$lineitem1 = new LineItem($item1, 5);
$item2 = new Item("2",5.31);
$item2->setDescription("Description for Item 2");
$item2->setImage("Image2");
$lineitem2 = new LineItem($item2, 8);
$ca->addLineItem($lineitem1);
$ca->addLineItem($lineitem2);
当我尝试通过键入单独显示每个行时间时,
print $lineitem1;
显示正确的结果。
但是,如果我尝试在ObjectCollection类中显示项目,它不会在屏幕上显示任何结果。
这是我用来显示我的对象集合的代码;
for ($i = 0; $i < $ca->getLineCount(); $i++) {
$li = $ca->getLineItem($i);
$item = $li->getItem();
print $i.")Description:" . $item->getDescription() . ",
Price: ". $item->getPrice() . ", Quantity:" . $li->getQuantity() . "<br />";
}
我应该对代码进行哪些更改,以便显示我的对象集合?
答案 0 :(得分:3)
您的ObjectCollection::getLineItem
方法会返回项目数组。
它不会处理传递的参数。
在最简单的情况下,方法getLineItem
应该重写为:
public function getLineItem($index) {
return $this->line_items_array[$index];
}
另一个选项是使用foreach
并按原样保留getLineItem
:
foreach ($ca->getLineItem() as $li) {
print $li;
}
答案 1 :(得分:1)
不改变任何其他内容,这可以解决您的问题:
ID VALUE DATE COMMENT
1 google.com 12/28/2015 Bad Stuff | Much Worse Stuff
2 yahoo.com 12/28/2015 Good Stuff
3 cnn.com 12/28/2015 Weird Stuff
4 facebook.com 12/28/2015 Crazy Stuff
如果您希望自己的代码更易读,请改用foreach ($ca->getLineItem() as $i => $li) {
$item = $li->getItem();
print ($i + 1).")Description:" . $item->getDescription() . ",
Price: ". $item->getPrice() . ", Quantity:" . $li->getQuantity() . "<br />";
}
:
sprintf()
供参考,请参阅http://php.net/manual/en/function.sprintf.php。
foreach ($ca->getLineItem() as $i => $li) {
$item = $li->getItem();
print sprintf(
"%s)Description:%s, Price: %s, Quantity:%s<br />",
$i + 1,
$item->getDescription(),
$item->getPrice(),
$li->getQuantity()
);
}
中的局部变量$lineCounter
未定义,您应该(如注释掉的那样)返回实例字段:
ObjectCollection::getLineCount()
答案 2 :(得分:0)
使用print_r($ca)
或var_dump($ca)
查看对象包含的数据。
print_r 递归打印(对数组有用) var_dump 显示对象的内容