为开发人员使用每个项的子类创建的类中的项维护项维护


Maintain item maintenance for a items in a class created by developer using subclass per item

如果有人有想法,我想不出更好的方法来分阶段提出问题。

我尽量不把这个解释复杂化。

我正在写一个"引号"类,它是主类。这个类具有"整体"函数,这些函数根据存储在其数组中的"项"预处理计算。可以说,最终开发人员将其称为$q = new apiQuote/quote()

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

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

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

我添加了setItem方法,其中参数将是表示数组中项目索引的整数,并将$q->item设置为所选的项目索引。这是有效的,但似乎仍然"没有我想要的那么高效"。

我很好奇的是,是否有人对更好的方法有任何建议。我试着寻找一个"cards/deck"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();

然而,第二个想法意味着将"items"数组公开,这可能会导致大量的"其他"问题,因为我正试图将整个事情设置为"近乎伪证明"。因此,protected变量与特定get/set方法的使用就好像它们具有C#属性一样。

我认为您的问题是如何识别报价实例之外的"项"。通过使用它的数组索引,你会觉得你会遇到问题。当你试图删除一个项目时,你会的。它将成功地使任何已知/存储在外部的索引失效。最简单的补丁是给每个项目一个唯一的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

好吧,您可以从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;