Php 只读集合

Php 只读集合,php,oop,collections,Php,Oop,Collections,我正在寻找PHP中的只读集合。我已经搜索过了,但还找不到本机实现。我想我绝对不是第一个需要这样东西的程序员: 我的情况如下:cart类包含许多cartItems。cartItems只能通过cart(其聚合根)进行编辑。要显示这些项目,我的购物车需要返回一种类型的集合。(此集合中的项目已设置为只读)。我更喜欢通过引用传递集合,因此共享集合总是最新的。(甚至认为我在提取集合后删除/添加了一个项目) 这些项目存储在购物车的ArrayObject中。是否有本机类将ArrayObject包装为只读?如果没

我正在寻找PHP中的只读集合。我已经搜索过了,但还找不到本机实现。我想我绝对不是第一个需要这样东西的程序员:

我的情况如下:cart类包含许多cartItems。cartItems只能通过cart(其聚合根)进行编辑。要显示这些项目,我的购物车需要返回一种类型的集合。(此集合中的项目已设置为只读)。我更喜欢通过引用传递集合,因此共享集合总是最新的。(甚至认为我在提取集合后删除/添加了一个项目)


这些项目存储在购物车的ArrayObject中。是否有本机类将ArrayObject包装为只读?如果没有,这样的包装器是否存在于另一种类型的集合中,或者我需要自己编写吗?

您很可能需要自己编写它,利用类中可用的
私有属性类型。我认为这是唯一可行的办法。请记住,即使这样也不是防弹的,因为您可以使用反射绕过它。尽管如此,它仍然遵循着一句谚语:如果有人想打破它,他们会打破它


将ArrayObject包装为更大类的私有属性,并且只允许通过该类的方法访问该对象(静态或动态,无所谓)。这将提供与您尝试执行的操作最接近的匹配,因为它将允许您人为地允许读取(脑海中浮现的是魔术方法uu get()),而不是写入。

在这次讨论中,我有一个解决问题的想法:我让我的购物车实现迭代器。因此,我的视图能够显示我的购物车及其项目。结果,购物车总是返回只读cartItemObjects。所以我永远不需要出版一个收藏。感谢您的参与

为什么不写一个if语句来检查数组中是否有空的()?OO私有属性。@Lucas我不明白你的问题。我的问题与确定集合是否包含对象无关…@dagon我的收藏是私有的,但我不想发布它的只读版本。你在PHP中构建的东西只会像你写的那样死板或灵活。要为您使用的任何函数或方法设置只读,在运行之前进行一次小检查可以实现这一点。也许我写的问题有点让人困惑。。。简而言之:Foo应该返回一个集合。此集合之后与Foo没有任何关系。因为Foo需要保持有效,所以集合应该是只读的。当然,违反规则总是可能的,但我想让他们知道他们做错了什么。为什么更改集合是错误的。它不是这样标记的。。。我的购物车已将ArrayObject作为私有财产。为了防止集合被修改,我将编写自己的包装器。。。感谢您的建议,我认为您可以实现一个静态函数来返回集合的克隆版本。源保持不变,但您可以自由更改返回的对象,因为它们不再链接。查找clone关键字。为什么您认为这个方法应该是静态的?如果它返回克隆的集合,则如果我首先提取集合,编辑购物车/其项目,然后使用它,则该集合不是最新的……如果您希望该集合通过并在其每个实例上自动更新,则您别无选择,它必须以一种或另一种方式通过引用传递。您提出的迭代器是一个相对不错的主意,但不会阻止人们直接使用它(很遗憾)。最终,我认为您达到了PHP的一个极限。