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

Php 维护由开发人员使用每个项的子类创建的类中的项的项维护,php,php-5.3,Php,Php 5.3,如果有人有主意的话,我想不出更好的方法来逐步解决这个问题 我会尽量不让这个解释复杂化 我正在写一个“quotes”类,它是主类。此类具有“总体”函数,这些函数根据存储在其数组中的“项”执行计算。只需说一句,最终开发人员将把它称为$q=new apiQuote/quote() 然后,在它有任何用途之前,必须添加第一项并设置其属性,以便它可以进行“自己的”计算。类似于$q->createItem()。使用此调用创建项后,类“item”的“item”将添加到名为“items”的“quotes”中的数组

如果有人有主意的话,我想不出更好的方法来逐步解决这个问题

我会尽量不让这个解释复杂化

我正在写一个“quotes”类,它是主类。此类具有“总体”函数,这些函数根据存储在其数组中的“项”执行计算。只需说一句,最终开发人员将把它称为
$q=new apiQuote/quote()

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

当前可编辑的项,
$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语言中具有的相同属性功能,因此否定了我在创建这种“class/subclass[items]”类型结构时所使用的功能

实际上,我只想知道是否有人做过类似的事情,我是否在“尽我所能”做事情,或者是否有更好的方法,通过PHP,允许“最终开发人员”调用一个主类,并基于一个子类创建一个列表“项”,该子类稍后可用于主类的方法

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

也许是对我所拥有的和我“可能”想看到的东西的看法:

现在的工作方式 我“认为”我可能喜欢的:
然而,类似于第二个想法的东西意味着将“items”数组公之于众,这可能会导致大量的“其他”问题,因为我正试图将整个事情设置为“近乎虚拟的证明”。因此,
protected
变量与特定的
get/set
方法的使用就像它们在C#properties中一样

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

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

或者,我建议您不要重新发明车轮,请看这里:

这里是具体的

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


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

不知道你的问题到底是什么。您已经有了一个解决方案(未显示,但看起来很简单),您正在寻找更好的解决方案?你想把编辑限制在最后添加的项目上有什么原因吗?@Technoh我有一个拼写错误,但已经修复了,并且在数组中添加了“编辑项目”的方法,但是我觉得这不是最好的方式。虽然我不确定我是否能描述,甚至想不出更好的方法,因此我的文章是针对这个问题的,如果有人这样做了,他们是否有“更好的方法”。你如何在.NET中进行这样的关联?@PatrickEvans类似于
Dim deck as new deck()Dim card as deck.card()card.prop=“where”deck.add(card)哎哟,这是最基本的:)啊,我明白了,我还没有真正想过。Thanx,现在正在调查(测试)这个。谢谢你的链接,我甚至不知道这是关于PHP的!喜欢
SplObjectStorage
现在就开始玩吧!我选择了您的答案,但主要是为了指向SplObjectStorage的链接,因为这是我现在正在实现的,我非常喜欢使用类来处理它,并为最终开发人员错误创建更少的空间!您不需要将对象作为引用返回。它们总是作为引用返回。引用必须只用于标量和数组。是的,我想了很多,但不确定,只是也在查找它,看看是否是这样。
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;
...
function getItem($index){
   return $this->items[count($this->items)-1];
}
$otheritem = $q->getItem(3);
$otheritem->totalHeight = 100;