PHP从对象集合

时间:2015-12-28 18:48:15

标签: php oop

我正在尝试创建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 />";
  }

我应该对代码进行哪些更改,以便显示我的对象集合?

3 个答案:

答案 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 显示对象的内容