1

如果有人有想法,我想不出更好的方法来解决这个问题。

我会尽量不使解释复杂化。

我正在写一个作为主类的“引号”类。此类具有“整体”功能,可根据存储在其数组中的“项目”进行计算。可以这么说,最终开发人员将其称为$q = new apiQuote/quote().

然后,在它有任何用途之前,必须添加第一项并设置它的属性,以便它可以进行“自己的”计算。类似的东西$q->createItem()。使用此调用创建项目后,将“项目”类的“项目”添加到名为“项目”的“引号”中的数组中。

当前可编辑的项目$q->item始终是通过该createItem方法添加到数组中的最后一个项目。看起来像:

public function createNewItem() {
    $this->items[] = new item();
    $this->item = $this->items[count($this->items)-1];
}

我添加了setItem方法,其中参数将是一个整数,表示数组中的项目索引,并将设置$q->item为选择的项目索引。这行得通,但似乎仍然“不如我想的那样富有成效”。

我很好奇的是,是否有人对解决此问题的更好方法有任何建议。我试着寻找一个“卡片/甲板”的 php 示例,但我能找到的只是数组洗牌,这在这里有点没用。我知道如何在 .NET 中进行此类关联,并认为这同样容易,但我在 PHP 中没有与 .NET 语言相同的属性能力,因此否定了我在创建时所习惯的这种“类/子类[项目]”类型的结构。

真的,我只想知道是否有人做过类似的事情,以及我是否正在尽“最大能力”做事,或者是否有更好的方法,通过 PHP,允许“最终开发人员”调用一个主类并基于子类创建一个列表“项目”,以后可用于主类的方法?

我真的希望这能很好地总结这一切,并且我没有超出“提问”的指导方针,但我想不出更好的地方,除了代码审查提出这样一个问题并获得优秀的开发人员反馈。如果你们都觉得我需要将其移至代码审查,请告诉我。我选择这个而不是 CR 的主要原因是这个站点往往会得到更快的响应。

也许是对我所拥有的以及我“可能”希望看到的东西的看法:

现在的工作方式

$q = new apiQuote\quote(TRUE);

$q->createNewItem();
$q->item->totalHeight = 100;
$q->item->totalWidth = 250;
...

$q->createNewItem();
$q->item->totalHeight = 300;
$q->item->set_coverage('25%');
...
$q->setItem(1);
$q->item->totalHeight = 250;
...
$q->getTotalsCurv(); // an array to create a graph curve of totals from each item

我“认为”我可能会喜欢:

$q = new apiQuote\quote(TRUE);

$q->items[] = new apiQuote\item();
$q->items[0]->totalHeight = 100;
$q->items[0]->totalWidth = 250;
...

$q->items[] = new apiQuote\item();
$q->items[1]->totalHeight = 300;
$q->items[1]->set_coverage('25%');
...
$q->items[0]->totalHeight = 250;
...
$q->getTotalsCurv();

但是,类似于第二个想法的意思是让“项目”数组公开,这可能会导致大量“其他”问题,因为我正试图将整个事情设置为“接近虚拟证明”。因此,使用protected具有特定方法的变量get/set就好像它们在 C# 属性中一样。

4

2 回答 2

1

我认为您的问题是如何识别报价实例之外的“项目”。通过使用它的数组索引,你会觉得你会遇到问题。当您尝试删除项目时,您会这样做。它将成功地使任何已知/存储在外部的索引无效。最简单的补丁是给每个项目一个唯一的 ID 并将它们存储在地图中,而不是将其存储为向量。

此外,您的解决方案项目本身无法为您提供任何有用的信息,如何访问您的项目集合中的此项目(报价)。

public function createNewItem() {
  static $counter;
  $id = $counter++;
  return $this->item = $this->items[$id] = new item($id);
}

public function editItem($id) {
 return $this->item = $this->items[$id];
}

public function removeItem($id) {
 $this->item = null;
 unset($this->item[$id]);
}

或者,我建议你不要重新发明轮子,看看这里:

http://php.net/manual/en/spl.datastructures.php

在这里具体 http://www.php.net/manual/en/class.splobjectstorage.php

任何实现 Iterator 接口的东西都可以用 foreach 进行迭代

http://www.php.net/manual/en/class.iterator.php

于 2013-08-22T15:15:02.327 回答
1

嗯,你可以从createItem函数中返回新项目。

您的 .NET 示例的等价物是简单地返回新项目

public function createNewItem() {
    $this->items[] = new item();
    $this->item = $this->items[count($this->items)-1];
    return $this->items[count($this->items)-1];
}

那么你可以做

$item = $q->createNewItem();
$item->totalHeight = 100;
...

而且由于您已经从内部将新项目添加到数组中,createNewItem因此不需要像 $q->add($item); 这样的东西。

要获得任何其他项目,你可以做一个

function getItem($index){
   return $this->items[count($this->items)-1];
}
$otheritem = $q->getItem(3);
$otheritem->totalHeight = 100;
于 2013-08-22T15:25:00.097 回答