前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文 | Laravel原来有2种集合Collection,怪不得老用不对!

3分钟短文 | Laravel原来有2种集合Collection,怪不得老用不对!

作者头像
程序员小助手
发布2020-08-03 20:36:47
4620
发布2020-08-03 20:36:47
举报
文章被收录于专栏:程序员小助手程序员小助手

在大多数情况下,将它们视为相同的实例并不会出错。不过在编程中,脑海里时常清晰地区分出正在使用的是那个Collection,可以有效减少不必要的调用。

学习时间

通常,我们使用助手函数 collect 创建一个集合,其实返回的是 Illuminate\Support\Collection 的一个实例。而集合 Illuminate\Database\Eloquent\Collection 则是通过 eloquent 方法返回数据时创建的,这很有区别。

因为 Illuminate\Database\Eloquent\Collection 是从 Illuminate\Support\Collection 继承过来的,理所当然,拥有基类所没有的许多特性,比如 find 方法,keyBy 方法。

还有一些是没重写了的方法,比如 contains ,unique 。

这些细微的差别,在编程时需要避免,防止出现 method 不存在的故障。比如下图:

因为类 Illuminate\Support\Collection 并没有 find 方法,必然导致错误。find 是在模型中才能调用的集合的方法。

PHP 7 中的类型提示

PHP 7中的新功能是返回类型声明。它可以帮助开发人员查看和检查返回类型是否与期望的返回类型匹配。

由于 Illuminate\Database\Eloquent\Collection 和 Illuminate\Support\Collection 之间的关系,我们可以在函数返回值上显式声明返回类型。

比如下面的代码:

在方法 popular 中使用的是 EloquentCollection 的方法,而返回值我们则强制其为 BaseCollection。这样就完成了类型的转换。

单元测试

PHPUnit 提供了 assertInstanceOf() 方法用于甄别返回类。

测试结果表明,对于返回对象类型使用 assertInstanceOf 断言,就算是继承的类,也可以断言成功。而如果使用 assertEquals ,则通不过。

写在最后

由于这两个集合之间的可用功能不同,因此对于何时可以使用,或不能使用这些方法,可能会造成混淆(如上所述)。

简化的方法,是将结果全部归为一种类型。它可以是数组,BaseCollection 或 EloquentCollection。

EloquentCollection 应该放最后,不得已而用之,因为它真的不是那么通用。

首选项是什么呢?数组!一旦统一了返回类型,就不会担心在开发时这能用那不能用的混作一团了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习时间
  • PHP 7 中的类型提示
  • 单元测试
  • 写在最后
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档