最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Laravel 中非变异式集合插入的正确实现方法
时间:2026-07-15 19:45:48 编辑:袖梨 来源:一聚教程网
Laravel 集合原生不提供非变异的 put() 方法,但可通过 clone 实现等效效果:克隆原集合后调用 put(),确保原始集合不变,新集合包含新增键值对。
laravel 集合原生不提供非变异的 `put()` 方法,但可通过 `clone` 实现等效效果:克隆原集合后调用 `put()`,确保原始集合不变,新集合包含新增键值对。
在 Laravel 开发中,Collection::put($key, $value) 是一个变异(mutating)方法——它直接修改原集合并返回自身。当你需要保留原始集合不变、仅生成一个新增键值对的新集合时,Laravel 并未内置类似 putNonMutating() 或 withPut() 的官方方法(查阅 Laravel 8.x 官方文档 — Collections 方法列表 可确认无此方法)。
不过,借助 PHP 原生的 clone 关键字,即可优雅、高效地达成目标:
$collection = collect(['key' => 'value']);$new = (clone $collection)->put('another', 'pair');$collection->all(); // ['key' => 'value']$new->all(); // ['key' => 'value', 'another' => 'pair']
✅ 该方案简洁、语义清晰,且性能优于 merge()(尤其在单键插入场景下):merge() 会遍历传入数组并执行键合并逻辑,而 clone + put 仅做一次浅拷贝与单次赋值。
⚠️ 注意事项:
- clone 执行的是浅拷贝(shallow copy)。若集合中包含对象,这些对象的引用仍被共享,修改对象属性会影响原集合中的对应项;
- 如需深拷贝(deep clone),应自行实现或使用序列化/反序列化(如 unserialize(serialize($collection))),但需注意性能开销与对象可序列化性;
- 对于纯标量值(字符串、数字、布尔值、null)或不可变对象(如 DateTimeImmutable),浅拷贝完全安全。
? 替代思路参考:
虽然 merge(['another' => 'pair']) 能达到相同结果,但它本质是「合并逻辑」,语义上不如 clone + put 精准表达「添加单个键值对」的意图;且当键存在时,merge() 会覆盖,而 put() 同样覆盖——二者行为一致,但前者开销略高。
总结:(clone $collection)->put(...) 是实现非变异 put 行为最直接、推荐的标准实践,兼顾可读性、性能与 Laravel 生态兼容性。
相关文章
- 逆战未来枪械大全 逆战未来枪械稀有度等级与获取方式详解 07-19
- 逆战未来新手攻略 逆战未来萌新入门避坑指南 07-19
- "无醇啤酒"是完全不含酒精吗 蚂蚁庄园1月17日答案早知道 07-19
- "太常寺"是古代掌管什么事务的机构 蚂蚁新村1月16日答案 07-19
- 四川名菜"开水白菜"就是用开水炖白菜吗 蚂蚁庄园1月17日答案早知道 07-19
- 蚂蚁新村今天正确答案1.16 07-19